我有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.pyc
中的foo.py
,但仍然没有运气。
我可以知道如何在运行时重新导入更新的代码吗?
答案 0 :(得分:87)
对于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)
答案 1 :(得分:61)
除了gnibbler的回答:
这在Python 3中改为:
>>> import imp
>>> imp.reload(foo)
正如@onnodb所指出的那样,自从Python 3.4以来,imp
被弃用而不是importlib
:
>>> import importlib
>>> importlib.reload(foo)
答案 2 :(得分:38)
IPython3的autoreload功能正常。
我正在使用网页上的实际示例。首先加载'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
答案 3 :(得分:4)
如果您希望自动执行此操作,则iPython附带autoreload模块。
答案 4 :(得分:1)
在 [15] 中代替 del foo
,使用
import sys
del sys.modules["foo"]
从模块缓存中删除 foo