当我跑:
exec "print __name__"
它打印__main__.
但是当我跑步时:
exec "print __name__" in {}
它打印__builtin__.
如何使第二个例子也打印__main__?
我试图实现的是使用exec运行一段代码,以便从它的角度看它是从命令行运行的.
我想用干净的范围来修改代码,但是第二个例子打破了依赖于__name__ ==“__ main__”的代码.如何解决这个问题?
@H_502_27@最佳答案@H_502_27@
您可以使用
imp.load_module
代替:
import imp
with open(mainfile) as src:
imp.load_module('__main__',src,mainfile,(".py","r",imp.PY_SOURCE))
请注意,当类型设置为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!
@H_502_27@