在交互模式下使用python导入模块然后如果模块被更改(错误修复或其他),可以简单地使用reload()命令。
但是,如果我没有导入整个模块并使用'from M import f,g'import语句,该怎么办?有没有办法重新进口g?
(我尝试通过'del g'从参数表中删除该函数并从目录中删除.pyc文件。它没有帮助。当我从M import g'重新导入函数时,旧的g被加载)。
答案 0 :(得分:9)
执行from foo import bar
时, 导入整个模块。您只是在当前命名空间中复制符号bar
。您不只导入该功能。
reload
函数并不完全可靠(例如,它不适用于已编译的C模块)。我建议您退出并重新启动解释器。
答案 1 :(得分:2)
对于from M import f, g
不是官方python模块的M
,请使用:
import sys
import importlib
importlib.reload(sys.modules['M'])
然后,使用以下命令重新导入f
和g
:
from M import f,g
如果M
是官方的python模块,请使用
import importlib
importlib.reload(M)
from M import f,g
答案 2 :(得分:1)
由于这仅适用于交互式解释器,因此我不认为:
def my_reload(mod, name):
reload(mod)
globals()[name] = getattr(mod, name)
myreload(somemodule, "some_function")
太可怕了。这只是像正常一样重新加载模块,然后将指向旧对象的名称重新绑定到新对象。这应该适用于reload
开始工作的所有情况。或者,您可以对其进行编程以获取实际对象并使用其__name__
属性获取名称。函数,类和模块都具有__name__
属性,但类似于模块级字典的东西却没有那么灵活。
它不会替换对除全局对象之外的对象的引用,但即使您最初使用虚线名称访问它也不会reload
。一旦对象的引用松动,你就无法做到。
答案 3 :(得分:0)
对于第一次导入,将导入的片段绑定到变量(这也会加快查找速度):
import numpy as NP
import numpy.linalg as LA
...
reload(LA)