18

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

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

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

文件 ex2.py 包含:

x = []

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

笔记:

%load_ext autoreload
%autoreload 2

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

有什么方法可以让 %run 的行为像这里的命令行一样吗?这似乎是使用 ipython 作为脚本测试环境的真正缺陷。(或者也许道德是一个模块不应该写入另一个模块的命名空间?)

4

2 回答 2

11

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

您将不得不明确调用

dreload(ex2)

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

请参阅 - http://ipython.org/ipython-doc/dev/api/generated/IPython.lib.deepreload.html

将来可能有计划%run自动进行深度重新加载,您可以找到这个问题,在撰写本文时,这仍然是一个悬而未决的问题,由用户在此处提出建议 - https://github.com/ipython/ipython/问题/461

于 2012-10-31T03:07:31.960 回答
6

我遇到了同样的问题。在我看来,这是 ipython 运行命令的不良影响——它不会重新加载导入的模块。

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

%load_ext autoreload
%autoreload 2

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

%load_ext autoreload
%autoreload 2
%run ex1.py

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

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

于 2013-11-18T17:04:41.927 回答