在IPython中重新加载子模块

目前我正在研究一个包含子模块并使用numpy / scipy的python项目。 Ipython被用作交互式控制台。 不幸的是,我对现在使用的工作stream程并不满意,希望能给出一些build议。

在IPython中,框架是通过一个简单的import命令加载的。 但是,通常需要在框架的某个子模块中更改代码。 在这一点上,一个模型已经加载,我使用IPython与它进行交互。

现在,这个框架包含了很多相互依赖的模块,也就是说,当框架初始加载时,主模块正在导入和configuration子模块。 代码的更改只有在使用reload(main_mod.sub_mod)重新reload(main_mod.sub_mod)模块时才会执行。 这很麻烦,因为我需要使用完整path分别重新加载所有已更改的模块。 如果reload(main_module)也会重新加载所有的子模块,但是没有重新加载numpy / scipy,这将是非常方便的。

IPython自带一些自动重装魔术:

 %load_ext autoreload %autoreload 2 

它会重新加载所有更改的模块,每次执行新的行之前。 这种工作方式与dreload稍有不同。 一些注意事项适用,input%autoreload? 看看会出什么问题。


如果要始终启用此设置,请修改您的IPythonconfiguration文件~/.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加载。

IPython提供dreload()recursion地重新加载所有的子模块。 就个人而言,我更喜欢使用%run() magic命令(虽然它不执行深层重载,正如John Salvatier在注释中指出的那样)。

出于某种原因,当您从一个笔记本导入代码到另一个笔记本时, %autoreloaddreload都无法工作。 只有纯Python reload工作:

 reload(module) 

基于[1] 。

这个怎么样:

 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中(我想),所以每次启动解释器时都会加载它。

另一种select:

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

在Ubuntu 14.04上对ipython和ipython3 v5.1.0进行了validation。

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 

在pythonJupyter笔记本,这样做:

 %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)]