ipython:使用%run时重新导入模块

2024-04-26 12:03:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我喜欢ipython,但我发现了%run的一个问题:当重复调用%run时,不会重新加载导入的模块。

假设文件ex1.py包含以下行:

import ex2
ex2.x.append(1)
print ex2.x

文件ex2.py包含:

x = []

现在,从命令行运行python ex1.py每次都会重复打印[1]。但从ipython内部调用%run ex1.py会重复打印[1]、[1,1]、[1,1,1]等,这是因为没有重新加载模块ex2.py。所以我们有一个问题:ipython运行脚本协议没有反映“真实世界”的行为。

注:

%load_ext autoreload
%autoreload 2

是否有帮助。只有对ex2.py文件进行了更改,这些行才会重新加载ex2.py。如果我们不做任何更改,或者只对ex1.py进行更改,就会得到不希望的行为。

有没有办法让%run的行为像这里的命令行一样?这似乎是使用ipython作为脚本测试环境的一个真正的缺陷。(或者说,寓意是模块不应该写入另一个模块的命名空间?)


Tags: 模块文件run命令行pyimport脚本协议
2条回答

即使autoreload扩展设置为2,%run ex1.py(或任何与此相关的脚本)也不会对导入的模块进行深度重新加载。这是ipython中%run命令工作方式的“缺陷”。

您必须显式调用

dreload(ex2)

在再次执行%run ex1.py之前进行深度重新加载。

见-http://ipython.org/ipython-doc/dev/api/generated/IPython.lib.deepreload.html

将来可能会有计划让%run自动进行深度重新加载,您可以找到这个问题,在编写本文时,这个问题仍然是一个开放的问题,这里的用户建议-https://github.com/ipython/ipython/issues/461

我遇到了同样的问题。在我看来,这是ipython的run命令的一个不受欢迎的效果——它不会重新加载导入的模块。

作者是对的:如果对ex2.py进行了更改,下面的命令将有助于重新加载

%load_ext autoreload
%autoreload 2

我最简单的方法是每次都修改导入的模块(在本例中是ex2.py),并在ipython中执行以下命令

%load_ext autoreload
%autoreload 2
%run ex1.py

这有助于重新加载ex2.py。

请注意,ex2.py每次在执行上述3行之前都必须进行修改。只有这样才能重新加载模块ex2。

相关问题 更多 >