重新导入python中的单个函数

时间:2010-12-08 09:20:17

标签: python function import

在交互模式下使用python导入模块然后如果模块被更改(错误修复或其他),可以简单地使用reload()命令。

但是,如果我没有导入整个模块并使用'from M import f,g'import语句,该怎么办?有没有办法重新进口g?

(我尝试通过'del g'从参数表中删除该函数并从目录中删除.pyc文件。它没有帮助。当我从M import g'重新导入函数时,旧的g被加载)。

4 个答案:

答案 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'])

然后,使用以下命令重新导入fg

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)