대화식으로 파이썬에서 모듈을 다시 가져 오기 가져올 수 있습니까? 시나리오는 다음과 같습니다.

나는 그것이 가능하다는 것을 알고 있지만 어떻게 기억하지 못한다.

파이썬에서 모듈을 어떻게 다시 가져올 수 있습니까? 시나리오는 다음과 같습니다. 대화식으로 모듈을 가져 와서 땜질하지만 오류가 발생합니다. .py 파일의 오류를 수정 한 다음 파이썬을 종료하지 않고 고정 모듈을 다시 가져오고 싶습니다. 어떻게하니 ?



답변

이것은 작동해야합니다 :

reload(my.module)

로부터 파이썬 문서

이전에 가져온 모듈을 다시로드하십시오. 인수는 모듈 객체 여야하므로 이전에 성공적으로 가져와야합니다. 외부 편집기를 사용하여 모듈 소스 파일을 편집했으며 Python 인터프리터를 떠나지 않고 새 버전을 시험해보고 싶을 때 유용합니다.

Python 3.4 이상을 실행하는 경우 do import importlib을 수행하십시오 importlib.reload(nameOfModule).

이 방법을 사용할 때의주의 사항을 잊지 마십시오.

  • 모듈을 다시로드하면 사전 (모듈의 전역 변수 포함)이 유지됩니다. 이름을 재정의하면 이전 정의가 재정의되므로 일반적으로 문제가되지 않지만 새 버전의 모듈에서 이전 버전으로 정의 된 이름을 정의하지 않으면 이전 정의가 제거되지 않습니다.

  • 모듈이을 사용하여 다른 모듈에서 객체를 가져 오는 경우 다른 모듈을 from ... import ...호출 reload()해도 가져 오는 객체가 재정의되지 않습니다.이 문제를 해결하는 한 가지 방법은 from문 을 다시 실행하는 것이고 다른 하나는 대신 import정규화 된 이름 ( module.*name*)을 사용하는 것입니다.

  • 모듈이 클래스의 인스턴스를 인스턴스화하는 경우 클래스를 정의하는 모듈을 다시로드해도 인스턴스의 메서드 정의에는 영향을 미치지 않습니다. 이전 클래스 정의는 계속 사용됩니다. 파생 클래스에서도 마찬가지입니다.


답변

파이썬 3에서는 reload더 이상 내장 함수가 아닙니다.

파이썬 3.4 이상을 사용 reload하는 경우 importlib대신 라이브러리 에서 사용해야 합니다.

import importlib
importlib.reload(some_module)

파이썬 3.2 또는 3.3을 사용하는 경우 다음을 수행해야합니다.

import imp
imp.reload(module)  

대신에. http://docs.python.org/3.0/library/imp.html#imp.reload를 참조 하십시오.

ipython사용하는 경우 autoreload확장명을 사용하는 것이 좋습니다 .

%load_ext autoreload
%autoreload 2

답변

실제로 Python 3에서 모듈 imp은 DEPRECATED로 표시됩니다. 글쎄, 적어도 3.4에 해당됩니다.

대신 모듈 의 reload기능을 importlib사용해야합니다.

https://docs.python.org/3/library/importlib.html#importlib.reload

그러나이 라이브러리에는 마지막 두 개의 부 버전에서 일부 API 변경이있었습니다.


답변

모듈에서 특정 함수 또는 클래스를 가져 오려면 다음을 수행하십시오.

import importlib
import sys
importlib.reload(sys.modules['my_module'])
from my_module import my_function

답변

제공된 답변은 특정 모듈에서 작동하지만 이 답변 에서 언급 한 것처럼 하위 모듈을 다시로드하지 않습니다 .

모듈이을 사용하여 다른 모듈에서 객체를 가져 오는 경우 다른 모듈을 from ... import ...호출 reload()해도 해당 모듈에서 가져온 객체를 재정의하지 않습니다.이 문제를 해결하는 한 가지 방법은 from 문을 다시 실행하는 것이고 다른 하나는 대신 import정규화 된 이름 ( module.*name*)을 사용하는 것입니다.

그러나 __all__변수를 사용하여 공개 API를 정의하는 경우 공개적으로 사용 가능한 모든 모듈을 자동으로 다시로드 할 수 있습니다.

# Python >= 3.5
import importlib
import types


def walk_reload(module: types.ModuleType) -> None:
    if hasattr(module, "__all__"):
        for submodule_name in module.__all__:
            walk_reload(getattr(module, submodule_name))
    importlib.reload(module)


walk_reload(my_module)

이전 답변에서 언급 한주의 사항은 여전히 ​​유효합니다. 특히, __all__변수에 설명 된대로 공개 API의 일부가 아닌 서브 모듈을 수정해도이 함수를 사용한 다시로드의 영향을받지 않습니다. 마찬가지로 하위 모듈의 요소를 제거해도 다시로드에 반영되지 않습니다.