나는 그것이 가능하다는 것을 알고 있지만 어떻게 기억하지 못한다.
파이썬에서 모듈을 어떻게 다시 가져올 수 있습니까? 시나리오는 다음과 같습니다. 대화식으로 모듈을 가져 와서 땜질하지만 오류가 발생합니다. .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의 일부가 아닌 서브 모듈을 수정해도이 함수를 사용한 다시로드의 영향을받지 않습니다. 마찬가지로 하위 모듈의 요소를 제거해도 다시로드에 반영되지 않습니다.