Python exec和__name__

时间:2013-04-01 09:32:34

标签: python scope exec

当我跑步时:

exec "print __name__"

打印__main__

但是当我跑步时:

exec "print __name__" in {}

打印__builtin__

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

我尝试实现的是使用exec运行一段代码,以便从它的角度看它是从命令行运行。

我想用干净的范围来修改代码,但第二个例子打破了依赖于if __name__ == "__main__"的代码。如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

您可以改为使用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时,它需要一个实际的文件对象,因此如果源代码来自文件以外的其他地方,则需要创建一个临时文件。< / p>

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

>>> src = '''\
... if __name__ == '__main__': print 'Main!'
... else: print 'Damn', __name__
... '''
>>> exec src
Main!
>>> exec src in {}
Damn __builtin__
>>> exec src in {'__name__':'__main__'}
Main!

答案 1 :(得分:0)

一种解决方案是在您的__name__字典中明确提供exec

exec "print __name__" in {'__name__': '__main__'}