programing

IPython 서브모듈 새로고침

projobs 2023. 1. 24. 08:35
반응형

IPython 서브모듈 새로고침

현재 서브모듈을 포함하고 numpy/scipy를 사용하는 python 프로젝트를 진행하고 있습니다.Ipython은 대화형 콘솔로 사용됩니다.유감스럽게도 현재 사용하고 있는 워크플로우가 마음에 들지 않습니다만, 몇 가지 조언을 해 주시면 감사하겠습니다.

한 IPython에 됩니다.import명령어를 입력합니다. 중 인 코드 한 경우가 .이 시점에서 모델이 이미 로드되어 IPython을 사용하여 모델과 상호 작용합니다.

현재 프레임워크에는 서로 의존하는 많은 모듈이 포함되어 있습니다.즉, 프레임워크가 처음 로드되었을 때 메인 모듈이 서브모듈을 Import 및 설정합니다.됩니다.reload(main_mod.sub_mod)모든 변경된 모듈을 풀패스를 사용하여 개별적으로 새로고침해야 하기 때문에 번거롭습니다.만약 그렇다면 매우 편리할 것이다.reload(main_module)또한 모든 서브모듈을 새로고침하지만 numpy/scipy는 새로고침하지 않습니다.

IPython에는 다음과 같은 자동 새로고침 매직이 포함되어 있습니다.

%load_ext autoreload
%autoreload 2

새 회선을 실행하기 전에 변경된 모든 모듈을 새로고침합니다. 하는 은 조금 , 이렇게 하다 보면.dreload 몇 가지 됩니다. 라고 입력합니다.%autoreload?뭐가 잘못될 수 있는지 보려고요


하게 하는 는, 「」를 합니다.~/.ipython/profile_default/ipython_config.py및 [1] 추가:

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

아래 코멘트를 통해 @Kos에게 크레딧을 보내드립니다.

[이 없는 경우~/.ipython/profile_default/ipython_config.pyipython profile create 번째, 파일 는 첫번번번 be first첫번번 。 또는 파일이 다음 위치에 있을 수 있습니다.$IPYTHONDIR.

이름이 allow인 모듈이 내부 Import에 액세스합니다.특히 다음과 같은 기능을 제공합니다.

import importlib
importlib.reload(my_module)

대반와는 %autoreload,importlib.reload()모듈로 설정된 글로벌 변수도 리셋합니다.대부분의 경우, 그것은 당신이 원하는 것입니다.

importlibPython 3.1 이후만 사용할 수 있습니다.이전 버전의 경우 모듈을 사용해야 합니다.

이 함수의 모든 경고 목록(재귀적 새로고침, 오래된 객체의 정의가 남아 있는 경우 등)을 얻으려면 의 설명서를 읽는 것이 좋습니다.

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

%load_ext autoreload
%autoreload 2

이는 기본적으로 pv의 답변과 동일합니다.단, 확장자 이름이 변경되어 다음 명령을 사용하여 로드됩니다.%load_ext.

인지 어느 쪽도 아니다%autoreload,도 아니다dreload어떤 노트북에서 다른 노트북으로 코드를 Import할 때 이 상황에 맞는 것 같습니다.플레인 Python만reload 삭제:

reload(module)

[1]에 근거합니다.

IPython은 모든 서브모듈을 재귀적으로 새로고침합니다.개인적으로 저는 magic 명령어를 사용하는 것을 선호합니다(단, John Salvatier가 코멘트에서 지적한 바와 같이 완전 새로고침은 하지 않습니다).

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(내 생각에)에 넣을 수도 있기 때문에 인터프리터를 시작할 때마다 로딩됩니다.

은 '새로고침'을 연 에 두 입니다.IPython:

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

.reload(module_name)아직 검토하지 않은 클래스 메서드가 새로고침되지 않아 설명할 수 없는 문제가 발생하는 경우는 거의 없습니다.

모듈을 Import하기 전에 다음 행이 포함됩니다.여기서 첫 번째 테스트에서는 자동 새로고침 확장이 이미 로드되었는지 여부를 테스트합니다.

if 'autoreload' not in get_ipython().extension_manager.loaded:
    %load_ext autoreload
%autoreload 2

import sys
    .
    .
    .

다른 옵션:

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

Ubuntu 14.04의 ipython 및 ipython3 v5.1.0으로 확인.

긴 스레드에 다른 답변을 추가하고 싶지는 않지만 다른 사용자가 유용하다고 생각할 수 있는 서브모듈을 재귀적으로 새로고침할 수 있는 솔루션을 찾았습니다(어차피 있습니다).

del에서 중 sys.modules iPython:

In[1]: from sys import modules
In[2]: del modules["mymodule.mysubmodule"] # tab completion can be used like mymodule.<tab>!

스크립트는 다음 서브모듈을 재귀적으로 새로고침합니다.

In[3]: %run myscript.py

의 「 」는, 「 」로 되어 있는 것에 해 주세요.autoreload변경된 파일을 수동으로 저장하는 경우(예를 들어 Ctrl+s 또는 cmd+s 사용) IntelliJ에서만 작동합니다.자동저축에서는 작동하지 않는 것 같아요.

Anaconda의 Jupyter 노트북에서 다음을 수행합니다.

%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비트 (인텔)]

이로 인해 서브 오브젝트가 새로고침되지 않으므로 IPython의 deepreload를 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/5364050/reloading-submodules-in-ipython

반응형