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


87

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

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


Answers:


116

对于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)

23
实际上,只需“ reload(foo)”-无需重新
分配

2
我无法正常工作。我正在获取TypeError:reload()参数必须为模块
Burak

2
@Burak,您要传递给reload模块的参数吗?例如。您应该import foo事先做
John La Rooy 2012年

27
请注意,如果您做了from foo import *from foo import barfoo则不会定义符号。您可能需要import sys然后reload(sys.modules['foo'])reload(sys.modules[bar.__module__])
drevicko

3
请让Python 2.x停止使用asp并停止支持Python 2.x!python 2.x pythonclock.org的倒计时
马丁·范·韦泽尔

65

除了狼吞虎咽的答案:

这在Python 3中更改为:

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

正如@onnodb所指出的,自Python 3.4开始imp不推荐使用importlib

>>> import importlib
>>> importlib.reload(foo)

5
只是一个小小的注解:在更高版本的Python 3.x中,不赞成使用“ imp”,而推荐使用“ importlib”。但是,工作方式相同。
onnodb

54

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

1
从富进口some_function,不能正常工作下Jupyterlab的Python 3.7.3工作
罗伯特·诺瓦克

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.