Python EXEC和__NAME__

2022-03-24 00:00:00 python exec scope

问题描述

当我运行时:

exec("print(__name__)")

它打印__main__

但是当我运行时:

exec("print __name__", {})

它打印builtins

如何使第二个示例也打印__main__

我试图实现的是使用exec()运行一段代码,这样从的角度看它就像是从命令行运行的。

我希望调整范围清晰的代码,但是第二个示例破坏了依赖if __name__ == "__main__"的代码。如何修复此问题?


解决方案

您可以改用imp.load_module

import imp

with open(mainfile) as src:
    imp.load_module('__main__', src, mainfile, (".py", "r", imp.PY_SOURCE))

这会将文件作为__main__模块导入,并执行它。

请注意,当类型设置为imp.PY_SOURCE时,它接受实际的文件对象,因此,如果您的源代码来自文件以外的其他地方,则需要创建一个临时文件才能正常工作。

否则,始终可以手动设置__name__

>>> src = '''
... if __name__ == '__main__': print('Main!')
... else: print('Damn', __name__)
... '''
>>> exec(src)
Main!
>>> exec(src, {})
Damn builtins
>>> exec(src, {'__name__':'__main__'})
Main!

相关文章