대화식으로 파이썬에서 모듈을 다시 가져 오기


382

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

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



답변:


368

이것은 작동해야합니다 :

reload(my.module)

로부터 파이썬 문서

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

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

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

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

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

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


26
를 사용하여 모듈을로드하면 from filename import *. 다시로드하는 방법?
Peter Zhu

"from mod import fcn"의 경우 @PeterZhu에서 모듈 객체는 네임 스페이스에 추가되지 않습니다. 따라서 모듈을 명시 적으로 가져와야 나중에 다시로드 할 수 있습니다. import foo; from foo import bar; reload(foo)
Ted

자동 재로드 마법뿐만 아니라 재로드를 시도했지만 코드 변경 사항이 오류 메시지의 스택에 반영되는 것을 볼 수 있지만 오류 자체는 여전히 오래된 코드에서 벗어난 것으로 보입니다 (예 : 오류 행은 정확히 동일합니다) 이전과 같이 주석으로 변경했으며 주석이 명확하게 오류를 일으킬 수는 없습니다. 내 모듈이 Jupyter Extension으로로드되었습니다. 다른 해결 방법이 필요한 사람이 있습니까? 감사!
yifanwu

1
"이름으로 가져 오기 모드"와 같이 함수를 가져온 경우 다음과 같이해야합니다. 'import importlib importlib.reload (name)'
Noe

이 메소드는 다른 모듈의 재로드 된 모듈 참조를 대체하지 않을 수 있습니다. 이에 대한 해결책 은 stackoverflow.com/a/61617169/2642356 을 참조하십시오 .
EZLearner

287

파이썬 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 코드가 Python 2로 작성되었지만 Python 3은 매일 더 실용적인 옵션이되고 있습니다. 팁 고마워!
Aaron Johnson

40
imp.reloadPython 3.4부터 사용되지 않으므로 대신 importlib.reload함수를 사용하십시오.
jfs

1
@ 앤드류 감사합니다! 나는 % autoreload를 사용했다. 훌륭하다. 이미 생성 된 객체는 클래스 메소드의 재 구현없이 자동으로 수정 된 클래스 메소드 구현을 얻었다
jeanmi

4
나는 조금 늦게 해요,하지만 난 당신이 다시로드해야하는 모듈 내에서 함수 또는 클래스 인 경우이 작업을하지 않는 생각 : 내 수입 한 Statment이 있다면 from mymodule import myfunc, 다음 importlib.reload(myfunc), importlib.reload(mymodule.myfunc), importlib.reload(mymodule)모두가 나가서 설명하자면 NameError을 제공합니다.
퍼프

@Puff 함수를 다시 가져 오는 방법에 대해서는 아래 답변을 참조하십시오.
jss367


6

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

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

0

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

모듈이을 사용하여 다른 모듈에서 객체를 가져 오는 경우 다른 모듈을 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의 일부가 아닌 서브 모듈을 수정해도이 함수를 사용한 다시로드의 영향을받지 않습니다. 마찬가지로 하위 모듈의 요소를 제거해도 다시로드에 반영되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.