Python exec and __name__(Python EXEC和__NAME__)
本文介绍了Python EXEC和__NAME__的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当我运行时:
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!
这篇关于Python EXEC和__NAME__的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
编程基础网
本文标题为:Python EXEC和__NAME__
基础教程推荐
猜你喜欢
- 尝试制作WhatsApp机器人 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
