【问题标题】:how to "reimport" module to python then code be changed after import如何将模块“重新导入”到 python,然后在导入后更改代码
【发布时间】: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 存在,但仍然没有运气。

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

【问题讨论】:

标签: python runtime ipython overloading python-import


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多