在this answer之后,我使用imp.new_module
和exec
动态加载模块并从中提取函数。但是,当我将模块存储在局部变量中时,来自它的函数会被破坏。举个例子:
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执行这个命令会产生None
:codepad。在取消global mod
行的注释,使mod
全局化之后,函数按预期工作并打印42:codepad。你知道吗
我错过了什么?当模块存储在局部变量中时,为什么行为会改变?你知道吗
mod
模块是本地模块,不在其他任何地方引用。与Python中的所有其他对象一样,这意味着它在main
退出时被清除。通过使其成为全局对象,保留对模块对象的引用。你知道吗清理模块时,所有全局变量都设置为
None
(这样做是为了尽早中断引用循环,设置为None
是一种优化,以防止由于字典大小调整而导致的过度重置)。func
对象仍然有对模块globals字典的引用,因此现在可以看到绑定到None
的a
。你知道吗导入模块的normal过程在
sys.modules
中添加对模块对象的引用,使模块保持活动状态,直到解释器关闭。你知道吗(在python3.4中,globals不再反弹到
None
(在大多数情况下),如Safe Object Finalization;参见PEP 442)。你知道吗相关问题 更多 >
编程相关推荐