如何在导入后重新导入模块以使代码生效

137 投票
5 回答
103016 浏览
提问于 2025-04-16 06:39

我有一个叫做 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)

撰写回答