在python中重新导入单个函数

在python中重新导入单个函数,python,function,import,Python,Function,Import,在交互模式下使用python导入一个模块,然后如果该模块发生更改(bug修复或其他),只需使用reload()命令即可 但是,如果我没有导入整个模块并使用'from M import f,g'import语句会怎么样呢。有没有办法只重新进口g (我尝试通过“del g”从参数表中删除函数,并从目录中删除.pyc文件。这没有帮助。当我从“M import g”重新导入函数时,加载了旧的g) 从foo导入栏执行时,您正在导入整个模块。您只是在当前名称空间中复制符号条。您不仅要导入函数 reload功

在交互模式下使用python导入一个模块,然后如果该模块发生更改(bug修复或其他),只需使用reload()命令即可

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


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

从foo导入栏执行
时,您正在导入整个模块。您只是在当前名称空间中复制符号
。您不仅要导入函数


reload
功能并非完全可靠(例如,它不适用于已编译的C模块)。我建议您退出并重新启动解释器

对于第一次导入,将导入的工件绑定到一个变量(这也加快了查找速度):


因为这只是为了交互式口译员,所以我不认为:

def my_reload(mod, name):
    reload(mod)
    globals()[name] = getattr(mod, name)

myreload(somemodule, "some_function")
那太可怕了。这只是像普通一样重新加载模块,然后将指向旧对象的名称重新绑定到新对象。这应该适用于
reload
一开始就可以工作的所有情况。或者,您可以对其进行编程,以获取实际对象,并使用其
\uuuu name\uuuu
属性获取名称。函数、类和模块都有
\uuuuu name\uuuuu
属性,但类似于模块级字典的东西却没有,因此它不会那么灵活


它不会替换对除全局对象之外存在的对象的引用,但也不会重新加载
,即使您最初使用虚线名称访问它。一旦对对象的引用松动,您就无能为力了。

对于来自M import f,g的
,如果
M
不是官方python模块,请使用:

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

+1用于明确导入模块与在名称空间中合并符号之间的关系。在python 2.7.3上,这不是一种简单的方法-当我从foo导入栏
导入时,符号
foo
不会被定义。模块在
sys.modules
中有一个条目,因此我可以成功地
重新加载(sys.modules['foo'])
(当然是在
导入sys
之后)。只需重新启动解释器;)
import importlib
importlib.reload(M)
from M import f,g