Python exec和__name__

Tuo*_* L. 5 python scope exec

当我跑:

exec "print __name__"
Run Code Online (Sandbox Code Playgroud)

它打印__main__.

但是当我跑步时:

exec "print __name__" in {}
Run Code Online (Sandbox Code Playgroud)

它打印__builtin__.

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

我试图实现的是运行一段代码,exec以便从它的角度看它是从命令行运行的.

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

Mar*_*ers 5

你可以imp.load_module改用:

import imp

with open(mainfile) as src:
    imp.load_module('__main__', src, mainfile, (".py", "r", imp.PY_SOURCE))
Run Code Online (Sandbox Code Playgroud)

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

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

否则,始终可以__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!
Run Code Online (Sandbox Code Playgroud)