5

当我运行时:

exec("print(__name__)")

它打印__main__

但是当我运行时:

exec("print __name__", {})

它打印builtins

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

我试图实现的是运行一段代码,exec()以便从它的角度来看它看起来像是从命令行运行的。

我想用干净的范围调整代码,但第二个示例破坏了依赖于if __name__ == "__main__". 如何解决这个问题?

4

2 回答 2

5

您可以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!
于 2013-04-01T09:39:29.003 回答
0

一种解决方案是在您的ution dict中__name__明确提供:exec

exec("print(__name__)", {'__name__': '__main__'})
于 2013-04-01T09:39:01.100 回答