当我跑步时:
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!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)