如何将“重新导入”模块转换为python,然后在导入后更改代码

时间:2010-11-06 02:49:56

标签: python runtime ipython overloading python-import

我有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,但仍然没有运气。

我可以知道如何在运行时重新导入更新的代码吗?

5 个答案:

答案 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