python重新加载文件_python - 在IPython中重新加载子模块

python - 在IPython中重新加载子模块

目前我正在开发一个包含子模块并使用numpy / scipy的python项目。 Ipython用作交互式控制台。 不幸的是,我对我现在使用的工作流程不是很满意,我将不胜感激。

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

现在,框架包含许多彼此依赖的模块,即当框架最初加载时,主模块正在导入和配置子模块。 只有在使用reload(main_mod.sub_mod)重新加载模块时才会执行对代码的更改。这很麻烦,因为我需要使用完整路径单独重新加载所有已更改的模块。 如果reload(main_module)也会重新加载所有子模块,但没有重新加载numpy / scipy将是非常方便的..

Alain asked 2019-02-04T02:05:26Z

9个解决方案

409 votes

IPython带有一些自动重装魔法:

%load_ext autoreload

%autoreload 2

它会在执行新行之前每次重新加载所有已更改的模块。 它的工作方式与~/.ipython/profile_default/ipython_config.py略有不同。一些警告适用,输入ipython profile create以查看可能出现的问题。

如果要始终启用此设置,请修改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。

pv. answered 2019-02-04T02:06:00Z

23 votes

在IPython 0.12(可能更早)中,您可以使用:

%load_ext autoreload

%autoreload 2

这与pv。的答案基本相同,只是扩展名已重命名,现在使用%load_ext加载。

RafG answered 2019-02-04T02:06:28Z

18 votes

IPython提供%run()以递归方式重新加载所有子模块。 就个人而言,我更喜欢使用%run()魔术命令(尽管它没有执行深度重载,正如John Salvatier在评论中指出的那样)。

Sven Marnach answered 2019-02-04T02:06:50Z

13 votes

出于某种原因,当您将代码从一个笔记本导入另一个笔记本时,%autoreload和dreload似乎都不适用于这种情况。 只有普通的Python reload才能工作:

reload(module)

基于[1]。

Dennis Golomazov answered 2019-02-04T02:07:19Z

3 votes

这个怎么样:

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

Y.H Wong answered 2019-02-04T02:07:42Z

2 votes

[http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script/]

为了避免一次又一次地输入这些魔术函数,可以将它们放入ipython启动脚本(在.ipython / profile_default / startup下使用.py后缀命名。该文件夹下的所有python脚本将根据词法顺序加载), 看起来如下:

from IPython import get_ipython

ipython = get_ipython()

ipython.magic("pylab")

ipython.magic("load_ext autoreload")

ipython.magic("autoreload 2")

Pegasus answered 2019-02-04T02:08:11Z

1 votes

另外一个选项:

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

%load_ext autoreload

%autoreload 2

EOF

在Ubuntu 14.04上的ipython和ipython3 v5.1.0上验证。

Chad answered 2019-02-04T02:08:35Z

0 votes

在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

ryanjdillon answered 2019-02-04T02:08:58Z

0 votes

在关于Anaconda的Jupyter笔记本上,这样做:

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

thanks_in_advance answered 2019-02-04T02:09:52Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值