如何在导入后重新导入模块以使代码生效
我有一个叫做 foo.py
的文件。
def foo():
print "test"
在 IPython 中,我使用:
In [6]: import foo
In [7]: foo.foo()
test
然后我把 foo()
改成了:
def foo():
print "test changed"
在 IPython 中,调用的结果仍然是 test
:
In [10]: import foo
In [11]: foo.foo()
test
接着我使用:
In [15]: del foo
In [16]: import foo
In [17]: foo.foo()
test
我删除了和 foo.py
在同一个文件夹里的 foo.pyc
文件,但还是没有成功。
请问我该如何在运行时重新导入更新后的代码呢?
5 个回答
73
除了gnibbler的回答之外:
在Python 3中,这个情况发生了变化:
>>> import imp
>>> imp.reload(foo)
正如@onnodb所提到的,从Python 3.4开始,imp
这个模块已经不推荐使用了,取而代之的是importlib
:
>>> import importlib
>>> importlib.reload(foo)
91
IPython3的自动重载功能非常好用。
我使用的是网页上的实际示例。首先,加载'autoreload'功能。
In []: %load_ext autoreload
In []: %autoreload 2
然后导入你想要测试的模块:
In []: import foo
In []: foo.some_function()
Out[]: 42
在编辑器中打开foo.py文件,把some_function改成返回43
In []: foo.some_function()
Out[]: 43
如果你直接导入这个函数,它也能正常工作。
In []: from foo import some_function
In []: some_function()
Out[]: 42
在some_function中做改动,让它返回43。
In []: some_function()
Out[]: 43
173
针对 Python 2.x 版本
reload(foo)
针对 Python 3.x 版本
import importlib
import foo #import the module here, so that it can be reloaded.
importlib.reload(foo)