如何";“重新进口”;模块转换为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原始导入一些_函数。