IPython에서 하위 모듈 재로드


363

현재 하위 모듈을 포함하고 numpy / scipy를 사용하는 python 프로젝트를 진행 중입니다. Ipython은 대화식 콘솔로 사용됩니다. 불행히도 현재 사용중인 워크 플로우에별로 만족하지 않습니다. 조언을 부탁드립니다.

IPython에서 프레임 워크는 간단한 import명령으로 로드됩니다 . 그러나 종종 프레임 워크의 하위 모듈 중 하나에서 코드를 변경해야합니다. 이 시점에서 모델이 이미로드되었으며 IPython을 사용하여 모델과 상호 작용합니다.

이제 프레임 워크에는 서로 의존하는 많은 모듈이 포함되어 있습니다. 즉, 프레임 워크가 처음로드 될 때 기본 모듈은 하위 모듈을 가져오고 구성합니다. 코드 변경 사항은을 사용하여 모듈을 다시로드 한 경우에만 실행됩니다 reload(main_mod.sub_mod). 전체 경로를 사용하여 변경된 모든 모듈을 개별적으로 다시로드해야하기 때문에 번거 롭습니다. reload(main_module)모든 하위 모듈을 다시로드하지만 numpy / scipy를 다시로드하지 않으면 매우 편리합니다 .


좀 더 자세히 However, it is often necessary to change code in one of the submodules of the framework.설명해 주시겠습니까 necessary to change code? 그렇다면 왜 그런가요 ? 감사합니다
먹으십시오

16
@eat : 프레임 워크는 지속적으로 개발되고 있으므로 코드베이스에 지속적인 변화가 있습니다.
Alain

답변:


531

IPython은 자동 재로드 마법 과 함께 제공됩니다 .

%load_ext autoreload
%autoreload 2

새 줄을 실행하기 전에 매번 변경된 모든 모듈을 다시로드합니다. 이것이 작동하는 방식은와 약간 다릅니다 dreload. 어떤 경고가 적용되면 %autoreload?무엇이 잘못 될 수 있는지 확인하십시오.


항상이 설정을 사용하려면 IPython 구성 파일 ~/.ipython/profile_default/ipython_config.py[1]을 수정 하고 다음을 추가하십시오.

c.InteractiveShellApp.extensions = ['autoreload']     
c.InteractiveShellApp.exec_lines = ['%autoreload 2']

아래의 의견을 통해 @Kos에게 크레딧을 제공하십시오.

[1] 파일이 없으면 먼저 ~/.ipython/profile_default/ipython_config.py전화해야합니다 ipython profile create. 또는 파일이에있을 수 있습니다 $IPYTHONDIR.


63
내가 가진 c.InteractiveShellApp.extensions = ['autoreload']c.InteractiveShellApp.exec_lines = ['%autoreload 2']제 시가 ~/.ipython/profile_default/ipython_config.py.
Kos

4
성능에 영향을 줄 수 있으므로주의해서 사용하십시오.
asmeurer

3
재로드는 Ipython 쉘에서 Enter 키를 누를 때만 수행되며 일반적으로 눈에 띄지 않습니다.
pv.

3
이것은 패키지를 디버깅 할 때 잘 작동하므로 dreload의 목적은 dreload가 너무 침습적이며 matplotlib와 같은 일부 패키지가로드되면 오류를 인쇄하는 것입니다.
dashesy

3
@Kos 메소드를 사용하는 경우 c가 정의되어 있는지 확인하십시오. c = get_config ()
Tickon

27

IPython 0.12 (및 이전 버전)에서는 다음을 사용할 수 있습니다.

%load_ext autoreload
%autoreload 2

이것은 본질적으로 pv 의 답변과 동일합니다 . , 확장이 변경되었습니다 지금 사용하여로드되는 것을 제외 %load_ext.


20

어떤 이유로, 한 노트북에서 다른 노트북으로 코드가져올 때 상황에 맞지 %autoreload않거나 dreload작동 하지 않는 것 같습니다 . 평범한 파이썬 만 작동합니다.reload

reload(module)

기준 [1] .


10
Python 3.4 이상에서는 importlib 모듈에서 다시로드를 찾을 수 있습니다. 이 질문을 참조하십시오 .
Praveen

1
이 방법은 %autoreload기술 과 달리 인스턴스 방법을 추가 할 때 작동합니다 . 이에 대한 지원을 추가하기 %autoreload위한 공개 버그 보고서가 있습니다 . .
ijoseph

18

IPython은 dreload()모든 하위 모듈을 재귀 적으로 다시로드합니다. 개인적으로, 나는 %run()마술 명령 을 사용하는 것을 선호합니다 (설명에서 John Salvatier가 지적한 것처럼 깊은 재 장전을 수행하지는 않지만).


11
불행히도 % run script.py는 가져 오는 패키지가 아닌 호출하는 스크립트 만 다시로드한다고 생각합니다. 빌드중인 패키지를 디버깅하려는 경우 어려움이있을 수 있습니다.
존 살바

2
NB. dreload최근 IPython (예 : IPython 6.0)에서 deepreload 로 대체되었습니다 .
dan mackinlay

8

이름이 지정된 모듈은 importlib내부 가져 오기에 액세스 할 수 있습니다. 특히 기능을 제공합니다 importlib.reload().

import importlib
importlib.reload(my_module)

의 반대에 %autoreload, importlib.reload()또한 모듈에 설정된 전역 변수를 재설정합니다. 대부분의 경우 원하는 것입니다.

importlibPython 3.1부터 만 사용할 수 있습니다. 이전 버전의 경우 module을 사용해야합니다 imp.


나를 위해 일한 유일한 솔루션
gustavz

5

http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script/

이러한 마술 함수를 반복해서 입력하지 않으려면 ipython 시작 스크립트에 넣을 수 있습니다 (.ipython / profile_default / startup에서 .py 접미사로 이름을 지정하십시오. 해당 폴더 아래의 모든 python 스크립트는 어휘 순서에 따라로드됩니다). 다음과 같습니다.

from IPython import get_ipython
ipython = get_ipython()

ipython.magic("pylab")
ipython.magic("load_ext autoreload")
ipython.magic("autoreload 2")

당신이 예를 사용하여 스크립트를 실행하는 경우에도 작동하는 것 같다 %run script.pyIPython REPL에서
패트릭 Sanan을

3

이건 어때요:

import inspect

# needs to be primed with an empty set for loaded
def recursively_reload_all_submodules(module, loaded=None):
    for name in dir(module):
        member = getattr(module, name)
        if inspect.ismodule(member) and member not in loaded:
            recursively_reload_all_submodules(member, loaded)
    loaded.add(module)
    reload(module)

import mymodule
recursively_reload_all_submodules(mymodule, set())

이렇게하면 전체 모듈 트리와 하위 모듈 트리를 효과적으로 다시로드 할 수 있습니다. 이 함수를 .ipythonrc (제 생각에)에 넣을 수 있으므로 인터프리터를 시작할 때마다로드됩니다.


그 외모 좋은, 그러나, 그것은 모듈 또는 사용하여 가져온 모듈의 구성원 커버되지 않는다는 것을 수 있습니다 from ... import ...또는 import ... as. 적어도 터미널에서 대화 형으로 작업 할 때 종종 문제가 발생합니다. 미리 정의 된 상태에서 작업을 시작하는 데 필요한 가져 오기 및 설정을 수행하는 IPython에서 저장된 매크로를 사용하도록 이동했습니다.
Bernhard

실제로 커버를 수행 from ... import ...하고 import ... as당신이 가져온 것은 모듈만큼. 다루지 않는 유일한 것은 __init__.py파일 에서로드되지 않은 패키지의 모듈입니다 . 패키지의 경우 모듈의 __path__속성이 디렉토리 인지 확인할 수 있습니다 . 있는 경우 탐색하고 찾을 수있는 모든 모듈을 재귀 적으로 가져 오십시오. 저자가 패키지 솔루션을 요구하지 않았기 때문에이 부분을 쓰지 않았습니다.
YH Wong

실제로 이것은 좋아 보인다. 나는 몇 가지에 따라 즉, 기능 거기에 내장 될 것이라고 기대하는 것과 같은 I에서,이 가능성에 대해 생각 . 그러나 이것을 사용하는 방법은 분명하지 않았습니다. 원래 질문을 게시하기 전에 발생 해야하는 파기 후에이 확장을 찾았습니다 .
Alain

또한 pkgutil패키지가 하위 모듈을 최상위 모듈로 가져 오지 않더라도 패키지의 모든 하위 모듈을 가져 오는 데 사용할 수 있습니다 . stackoverflow.com/a/1707786/1243926
osa

모듈 :sys.modules:
aoeu256

2

다른 옵션 :

$ cat << EOF > ~/.ipython/profile_default/startup/50-autoreload.ipy
%load_ext autoreload
%autoreload 2
EOF

Ubuntu 14.04의 ipython 및 ipython3 v5.1.0에서 확인되었습니다.


1

리로딩에 대한 나의 표준 관행은 처음 개봉 후 두 방법을 결합하는 것입니다 IPython.

from IPython.lib.deepreload import reload
%load_ext autoreload
%autoreload 2

이 작업을 수행하기 전에 모듈을로드하면 매뉴얼을 사용해도 다시로드되지 않습니다 reload(module_name). 나는 아직도, 아직 살펴 보지 않은 클래스 메소드가 다시로드되지 않는 문제를 설명하는 경우가 거의 없습니다.


1

위에서 언급 한 autoreload파일은 변경된 파일을 수동으로 저장하는 경우 (예 : ctrl + s 또는 cmd + s 사용) IntelliJ에서만 작동합니다. 자동 저장 기능이 작동하지 않는 것 같습니다.


나는 이것이 PyCharm의 경우임을 확인합니다.
tsando

0

Anaconda의 Jupyter Notebook에서 다음을 수행하십시오.

%load_ext autoreload
%autoreload 2

메시지를 생성 :

자동 새로 고침 확장 프로그램이 이미로드되었습니다. 다시로드하려면 다음을 사용하십시오. %reload_ext autoreload

다음과 같이하는 것이 바람직합니다.

%reload_ext autoreload
%autoreload 2

버전 정보 :

노트북 서버의 버전은 5.0.0이며 다음에서 실행됩니다. Python 3.6.2 | Anaconda, Inc. | (기본값, 2017 년 9 월 20 일 13:35:58) [MSC v.1900 32 비트 (Intel)]


0

이것으로 하위 객체를 다시로드하지 않을 것이므로 IPython의 딥 리로드를 사용해야한다고 생각합니다.

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