在IPython中重新加载子模块

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

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

现在,框架包含许多相互依赖的模块,即,当框架最初加载时,主模块正在导入和配置子模块。 只有在使用reload(main_mod.sub_mod)重新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加载。


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

链接地址: http://www.djcxy.com/p/68933.html

上一篇: Reloading submodules in IPython

下一篇: Arrange odd number of plots using rasterVis and gridExtra