tutorial - scipy python install




在IPython中重新加載子模塊 (6)

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

目前我正在研究一個包含子模塊並使用numpy / scipy的python項目。 Ipython用作交互式控制台。 不幸的是,我對現在使用的工作流程並不滿意,我希望能提供一些建議。

在IPython中,框架由一個簡單的import命令加載。 但是,通常需要更改框架的某個子模塊中的代碼。 此時模型已經加載,我使用IPython與它進行交互。

現在,框架包含許多相互依賴的模塊,即,當框架最初加載時,主模塊正在導入和配置子模塊。 只有在使用reload(main_mod.sub_mod)重新reload(main_mod.sub_mod)模塊時才會執行對代碼的更改。 這很麻煩,因為我需要使用完整路徑分別重新加載所有已更改的模塊。 如果reload(main_module)也會重新加載所有的子模塊,但沒有重新加載numpy / scipy,將會非常方便。


IPython提供dreload()遞歸地重新加載所有子模塊。 就個人而言,我更喜歡使用%run() magic命令(儘管它不執行深度重載,正如John Salvatier在註釋中指出的那樣)。


另外一個選擇:

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

在Ubuntu 14.04上對ipython和ipython3 v5.1.0進行了驗證。


IPython3運行腳本在使用%autoreload magic時不會重新加載模塊。

%run my_script.py

# Make changes to `my_module` imported inside `my_script.py`

%load_ext autoreload
%autoreload 2

%run my_script.py

# changes not loaded

以下為我工作:

%run my_script.py

# Make changes to `my_module` imported inside `my_script.py`

from IPython.lib.deepreload import reload
reload(my_module_name)

%run my_script.py

# changes correctly loaded

在IPython 0.12(可能更早)中,您可以使用這個:

%load_ext autoreload
%autoreload 2

這與的回答基本相同 ,除了擴展名已被重命名並且現在使用%load_ext加載。


這個怎麼樣:

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