python - 在IPython中重新加载子模块
目前我正在开发一个包含子模块并使用numpy / scipy的python项目。 Ipython用作交互式控制台。 不幸的是,我对我现在使用的工作流程不是很满意,我将不胜感激。
在IPython中,框架由一个简单的reload(main_mod.sub_mod)命令加载。 但是,通常需要更改框架的一个子模块中的代码。 此时已经加载了一个模型,我使用IPython与它进行交互。
现在,框架包含许多彼此依赖的模块,即当框架最初加载时,主模块正在导入和配置子模块。 只有在使用reload(main_mod.sub_mod)重新加载模块时才会执行对代码的更改。这很麻烦,因为我需要使用完整路径单独重新加载所有已更改的模块。 如果reload(main_module)也会重新加载所有子模块,但没有重新加载numpy / scipy将是非常方便的..
Alain asked 2019-02-04T02:05:26Z
9个解决方案
409 votes
IPython带有一些自动重装魔法:
%load_ext autoreload
%autoreload 2
它会在执行新行之前每次重新加载所有已更改的模块。 它的工作方式与~/.ipython/profile_default/ipython_config.py略有不同。一些警告适用,输入ipython profile create以查看可能出现的问题。
如果要始终启用此设置,请修改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。
pv. answered 2019-02-04T02:06:00Z
23 votes
在IPython 0.12(可能更早)中,您可以使用:
%load_ext autoreload
%autoreload 2
这与pv。的答案基本相同,只是扩展名已重命名,现在使用%load_ext加载。
RafG answered 2019-02-04T02:06:28Z
18 votes
IPython提供%run()以递归方式重新加载所有子模块。 就个人而言,我更喜欢使用%run()魔术命令(尽管它没有执行深度重载,正如John Salvatier在评论中指出的那样)。
Sven Marnach answered 2019-02-04T02:06:50Z
13 votes
出于某种原因,当您将代码从一个笔记本导入另一个笔记本时,%autoreload和dreload似乎都不适用于这种情况。 只有普通的Python reload才能工作:
reload(module)
基于[1]。
Dennis Golomazov answered 2019-02-04T02:07:19Z
3 votes
这个怎么样:
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中(我认为),以便每次启动解释器时都会加载它。
Y.H Wong answered 2019-02-04T02:07:42Z
2 votes
[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")
Pegasus answered 2019-02-04T02:08:11Z
1 votes
另外一个选项:
$ cat << EOF > ~/.ipython/profile_default/startup/50-autoreload.ipy
%load_ext autoreload
%autoreload 2
EOF
在Ubuntu 14.04上的ipython和ipython3 v5.1.0上验证。
Chad answered 2019-02-04T02:08:35Z
0 votes
在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
ryanjdillon answered 2019-02-04T02:08:58Z
0 votes
在关于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 bit(Intel)]
thanks_in_advance answered 2019-02-04T02:09:52Z