我喜欢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作为脚本测试环境的一个真正缺陷。(或者可能的寓意是,一个模块不应该写入另一个模块的命名空间?)
%run ex1.py
(或任何脚本)不会对导入的模块进行深度重新加载,即使autoreload扩展设置为2也是如此。%run
命令在ipython中的工作方式存在"缺陷"。
您必须明确调用
dreload(ex2)
以便在再次执行CCD_ 4之前进行深度重新加载。
请参阅-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.
请注意,在执行上面的3行之前,每次都必须修改ex2.py。只有通过这种方式,模块ex2才能被重新加载。