현재 하위 모듈을 포함하고 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()
또한 모듈에 설정된 전역 변수를 재설정합니다. 대부분의 경우 원하는 것입니다.
importlib
Python 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 (제 생각에)에 넣을 수 있으므로 인터프리터를 시작할 때마다로드됩니다.