[python] IPython에서 하위 모듈 재로드

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

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

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



답변

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.


답변

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

%load_ext autoreload
%autoreload 2

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


답변

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

reload(module)

기준 [1] .


답변

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


답변

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

import importlib
importlib.reload(my_module)

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

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


답변

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")


답변

이건 어때요:

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 (제 생각에)에 넣을 수 있으므로 인터프리터를 시작할 때마다로드됩니다.