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

Jas*_*son 18 python import module ipython

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

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

import ex2
ex2.x.append(1)
print ex2.x
Run Code Online (Sandbox Code Playgroud)

文件ex2.py包含:

x = []
Run Code Online (Sandbox Code Playgroud)

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

注意:

%load_ext autoreload
%autoreload 2
Run Code Online (Sandbox Code Playgroud)

没有帮助.只有在对ex2.py文件进行了更改后,这些行才会重新加载ex2.py.如果我们不做任何更改,或只对ex1.py进行更改,我们会得到不良行为.

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

Cal*_*eng 11

%run ex1.py(或者任何脚本)即使autoreload扩展设置为2,也不会对导入的模块进行深度重新加载.这是%run命令在ipython中如何工作的"缺陷" .

你必须明确地打电话

dreload(ex2)
Run Code Online (Sandbox Code Playgroud)

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

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

可能有计划%run在将来自动进行深度重新加载,你可以找到这个问题,这个问题在撰写本文时仍然是个问题,由用户在这里提出 - https://github.com/ipython/ipython/问题/ 461


lin*_*cao 6

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

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

%load_ext autoreload
%autoreload 2
Run Code Online (Sandbox Code Playgroud)

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

%load_ext autoreload
%autoreload 2
%run ex1.py
Run Code Online (Sandbox Code Playgroud)

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

请注意,每次执行上述3行之前,必须修改ex2.py.只有通过这种方式才能重新加载模块ex2.