如何";“重新进口”;模块转换为python,然后在导入后更改代码

如何";“重新进口”;模块转换为python,然后在导入后更改代码,python,runtime,ipython,overloading,python-import,Python,Runtime,Ipython,Overloading,Python Import,我有一个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 [

我有一个
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.py
中的
foo.pyc
存在,但仍然没有运气

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

对于Python 2.x

reload(foo)
对于Python3.x

import importlib
import foo #import the module here, so that it can be reloaded.
importlib.reload(foo)

除了格尼布勒的回答之外:

这在Python 3中更改为:

>>> import imp
>>> imp.reload(foo)
正如@onnodb指出的,
imp
被弃用,取而代之的是
importlib
,因为Python 3.4:

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

如果您希望自动实现这一点,那么iPython附带了一个模块。

IPython3的功能工作正常

我正在使用网页中的实际示例。首先加载“自动加载”功能

In []: %load_ext autoreload
In []: %autoreload 2
然后导入要测试的模块:

In []: import foo
In []: foo.some_function()
Out[]: 42
在编辑器中打开foo.py,并将某些_函数更改为返回43

In []: foo.some_function()
Out[]: 43
如果直接导入函数,它也可以工作

In []: from foo import some_function
In []: some_function()
Out[]: 42
更改某些_函数以返回43

In []: some_function()
Out[]: 43

在[15]中,使用

import sys
del sys.modules["foo"]

要从模块缓存中删除foo

实际上,只需“重新加载(foo)”-无需重新赋予itI属性,它就无法工作。我正在获取TypeError:reload()参数必须为module@Burak,是传递给
reload
a模块的参数吗?。例如,您应该在处理之前执行
import foo
。请注意,如果您执行了来自foo import*的
或来自foo import bar的
,则不会定义符号
foo
。您需要
导入sys
,然后
重新加载(sys.modules['foo'])
或者
重新加载(sys.modules[bar.\uuuu module.\uuuu])
请让Python2.x死掉,停止支持Python2.x!Python2.x的退役倒计时。只是一个小插曲:在Python3.x的更高版本中,“imp”被弃用,取而代之的是“importlib”。但工作方式相同。可能重复from foo import some_函数,无法在Jupyterlab Python 3.7.3下工作from foo import some_函数,无法在Jupyterlab Python 3.7下工作。3@RobertNowak我遇到了这个问题,但当我尝试在没有“from foo”的情况下“导入一些函数”时,它起了作用稍后在我的代码中从foo原始导入一些_函数。