在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在注释中指出的那样)。
上一篇: Reloading submodules in IPython
下一篇: Arrange odd number of plots using rasterVis and gridExtra