如何将模块“重新导入”到 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,然后在导入后更改代码的主要内容,如果未能解决你的问题,请参考以下文章