目前,我正在研究一个包含子模块的python项目,并使用numpy/scipy。使用Ipython作为交互控制台。不幸的是,我对我现在使用的工作流程不是很满意,我很感激一些建议。
在IPython中,框架是通过一个简单的导入命令加载的。但是,经常需要更改框架的一个子模块中的代码。此时,已经加载了一个模型,我使用IPython与它交互。
现在,框架包含许多相互依赖的模块,也就是说,当框架最初加载时,主模块正在导入和配置子模块。只有使用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配置文件create。或者文件可能位于$IPYTHONDIR。
名为importlib的模块允许访问导入内部。特别是,它提供了importlib.reload()函数:
import importlib
importlib.reload(my_module)
与%autoreload相反,importlib.reload()也会重置模块中设置的全局变量。在大多数情况下,这就是你想要的。
importlib仅在Python 3.1之后可用。对于旧版本,您必须使用模块imp。
我建议阅读importlib.reload()的文档,以获得此函数的所有警告列表(递归重载,保留旧对象定义的情况,等等……)