114

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

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

4

5 回答 5

147

对于 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)
于 2010-11-06T02:58:21.127 回答
70

除了gnibbler的回答:

这在 Python 3 中更改为:

>>> import imp
>>> imp.reload(foo)

正如@onnodb 指出的那样,自 Python 3.4 以来imp不推荐使用:importlib

>>> import importlib
>>> importlib.reload(foo)
于 2010-11-06T13:01:46.797 回答
69

IPython3 的自动重载功能工作得恰到好处。

我正在使用网页中的实际示例。首先加载“自动重载”功能。

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
于 2017-07-07T18:18:37.970 回答
7

如果您希望这自动发生,则iPython 附带了autoreload模块。

于 2016-10-23T15:41:38.090 回答
1

在 [15] 中del foo,使用

import sys
del sys.modules["foo"]

从模块缓存中删除 foo

于 2021-03-24T11:04:13.833 回答