在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在注释中指出的那样)。
出于某种原因,当您从一个笔记本导入代码到另一个笔记本时, %autoreload
和dreload
都无法工作。 只有纯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)]