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

Posted

技术标签:

【中文标题】如何将模块“重新导入”到 python,然后在导入后更改代码【英文标题】:how to "reimport" module to python then code be changed after import 【发布时间】:2011-05-05 22:16:12 【问题描述】:

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

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

【问题讨论】:

Reimport a module in python while interactive的可能重复 【参考方案1】:

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

【讨论】:

其实就是“reload(foo)”——不需要重新归属 我无法让它工作。我遇到 TypeError:reload() 参数必须是模块 @Burak,您传递给reload 的参数是一个模块吗?例如。你应该事先做import foo 请注意,如果您执行了from foo import *from foo import bar,则不会定义符号foo。你需要import sys 然后reload(sys.modules['foo']) 或者reload(sys.modules[bar.__module__]) 拜托,让 Python 2.x 死掉。并停止支持 Python 2.x ! python 2.x 退役倒计时pythonclock.org.【参考方案2】:

除了gnibbler的回答:

这在 Python 3 中更改为:

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

正如@onnodb 指出的那样,自 Python 3.4 起,imp 已被弃用,取而代之的是 importlib

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

【讨论】:

只是一个小旁注:在 Python 3.x 的更高版本中,“imp”已被弃用,取而代之的是“importlib”。不过,工作方式相同。【参考方案3】:

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

【讨论】:

from foo import some_function,在 Jupyterlab Python 3.7.3 下不工作【参考方案4】:

如果您希望自动执行此操作,则 iPython 附带了 autoreload 模块。

【讨论】:

from foo import some_function,在 Jupyterlab Python 3.7.3 下不工作 @Robert Nowak 我遇到了这个问题,但是当我在原始 from foo import some_function 之后的代码中稍后尝试“import some_function”而不使用“from foo”时,它起作用了。【参考方案5】:

在 [15] 中,而不是 del foo,使用

import sys
del sys.modules["foo"]

从模块缓存中删除 foo

【讨论】:

以上是关于如何将模块“重新导入”到 python,然后在导入后更改代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 解释器中重新导入更新的包? [复制]

Python 3:猴子补丁代码不能通过多处理重新导入

重新导入被测模块以丢失上下文

如何告诉 Python 重新导入我的脚本? [复制]

Python 的方法重载

Python中的reload函数