如何将"重新导入"模块转换为python,然后在导入后更改代码

use*_*514 73 python overloading runtime ipython python-import

我有一个 foo.py

def foo():
    print "test"
Run Code Online (Sandbox Code Playgroud)

在IPython中我使用:

In [6]:  import foo
In [7]:  foo.foo()
test
Run Code Online (Sandbox Code Playgroud)

然后我改为foo():

def foo():
    print "test changed"
Run Code Online (Sandbox Code Playgroud)

在IPython中,调用的结果仍然是test:

In [10]:  import foo
In [11]:  foo.foo()
test
Run Code Online (Sandbox Code Playgroud)

然后我用:

In [15]: del foo
In [16]:  import foo
In [17]:  foo.foo()
test
Run Code Online (Sandbox Code Playgroud)

我删除了foo.pyc相同的文件夹foo.py存在,但仍然没有运气.

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

Joh*_*ooy 97

对于Python 2.x

reload(foo)
Run Code Online (Sandbox Code Playgroud)

对于Python 3.x

import importlib
import foo #import the module here, so that it can be reloaded.
importlib.reload(foo)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您执行了`from foo import*`或`from foo import bar`,则不会定义符号`foo`.你需要`import sys`然后`reload(sys.modules ['foo'])`或者`reload(sys.modules [bar .__ module __])` (24认同)
  • 实际上,只需"重新加载(foo)" - 无需重新归因 (23认同)
  • 请让 Python 2.x 死掉并停止支持 Python 2.x!python 2.x 退休倒计时 https://pythonclock.org/ 。 (3认同)
  • 我无法让它发挥作用.我正在使用TypeError:reload()参数必须是模块 (2认同)
  • @Burak,你传递给`reload`模块的论点是什么?例如.你应该事先做`import foo` (2认同)

dan*_*lei 62

除了gnibbler的回答:

这在Python 3中改为:

>>> import imp
>>> imp.reload(foo)
Run Code Online (Sandbox Code Playgroud)

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

>>> import importlib
>>> importlib.reload(foo)
Run Code Online (Sandbox Code Playgroud)

  • 只是一个小旁注:在Python 3.x的更高版本中,"imp"被弃用而不是"importlib".但是,工作方式相同. (5认同)

小智 42

IPython3的自动重载功能效果恰到好处.

我正在使用网页上的实际示例.首先加载'autoreload'功能.

In []: %load_ext autoreload
In []: %autoreload 2
Run Code Online (Sandbox Code Playgroud)

然后导入要测试的模块:

In []: import foo
In []: foo.some_function()
Out[]: 42
Run Code Online (Sandbox Code Playgroud)

在编辑器中打开foo.py并更改some_function以返回43

In []: foo.some_function()
Out[]: 43
Run Code Online (Sandbox Code Playgroud)

如果直接导入函数,它也可以工作.

In []: from foo import some_function
In []: some_function()
Out[]: 42
Run Code Online (Sandbox Code Playgroud)

在some_function中进行更改以返回43.

In []: some_function()
Out[]: 43
Run Code Online (Sandbox Code Playgroud)

  • from foo import some_function,无法在 Jupyterlab Python 3.7.3 下工作 (2认同)
  • 最初,“from foo import some_function”似乎在这里也不起作用。但是,我注意到当我们调用“from foo import some_function”时,实际的重新加载并没有发生(正如我所期望的那样)。仅当您保存模块文件时才会发生这种情况!因此,在重新保存“foo.py”之后(即使没有任何修改),它会自动重新导入。甚至不需要再次调用“import”命令。因此,只需保存您的模块文件并重试,它就应该可以工作。 (2认同)

CpI*_*ILL 7

如果您希望这自动发生,则可以使用 iPython 附带的autoreload模块。