为什么动态加载模块的函数取决于模块的存储位置?

2024-06-25 23:43:48 发布

您现在位置:Python中文网/ 问答频道 /正文

this answer之后,我使用imp.new_moduleexec动态加载模块并从中提取函数。但是,当我将模块存储在局部变量中时,来自它的函数会被破坏。举个例子:

import imp

mod = None
func = None

code = """
a = 42

def func():
    print a
"""

def main():
    #global mod
    global func
    mod = imp.new_module("modulename")
    exec code in mod.__dict__
    func = mod.func

main()
func()

用Python2.7.3执行这个命令会产生Nonecodepad。在取消global mod行的注释,使mod全局化之后,函数按预期工作并打印42:codepad。你知道吗

我错过了什么?当模块存储在局部变量中时,为什么行为会改变?你知道吗


Tags: 模块函数nonemodnewmaindefcode
1条回答
网友
1楼 · 发布于 2024-06-25 23:43:48

mod模块是本地模块,不在其他任何地方引用。与Python中的所有其他对象一样,这意味着它在main退出时被清除。通过使其成为全局对象,保留对模块对象的引用。你知道吗

清理模块时,所有全局变量都设置为None(这样做是为了尽早中断引用循环,设置为None是一种优化,以防止由于字典大小调整而导致的过度重置)。func对象仍然有对模块globals字典的引用,因此现在可以看到绑定到Nonea。你知道吗

导入模块的normal过程在sys.modules中添加对模块对象的引用,使模块保持活动状态,直到解释器关闭。你知道吗

(在python3.4中,globals不再反弹到None(在大多数情况下),如Safe Object Finalization;参见PEP 442)。你知道吗

相关问题 更多 >