2012-10-31 92 views
18

当模块我爱IPython的,但我已经发现了%运行的一个问题:导入模块时运行%重复调用,不会重新加载。IPython的:重新导入使用%运行

假设文件ex1.py包含行:

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

和文件ex2.py包含:

x = [] 

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

注:

%load_ext autoreload 
%autoreload 2 

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

有没有什么办法让跑%表现喜欢这里的命令行?使用ipython作为脚本的测试环境似乎是一个真正的缺陷。 (或者道义上,一个模块不应该写入另一个模块的名称空间?)

回答

11

%run ex1.py(或任何有关此事的脚本)即使将autoreload扩展设置为2,也不会深入重新导入导入的模块它是一个“缺陷”有怎样的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

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才能被重新加载。