我喜欢 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 作为脚本测试环境的真正缺陷。(或者也许道德是一个模块不应该写入另一个模块的命名空间?)