替代Python 3中的execfile?
Python 2具有内置的函数execfile
,它在Python 3.0中被删除。 这个问题讨论了Python 3.0的替代方法,但自从Python 3.0以来,已经做了一些相当大的改变 。
Python 3.2的execfile
和未来的Python 3.x版本的最佳select是什么?
2to3
脚本(也是Python 3.2中的脚本)将被replace
execfile(filename, globals, locals)
通过
exec(compile(open(filename, "rb").read(), filename, 'exec'), globals, locals)
这似乎是官方的build议。
execfile(filename)
可以换成
exec(open(filename).read())
它适用于所有版本的Python
在Python3.x中,这是我能够直接执行一个文件的最接近的东西,它匹配正在运行的python /path/to/somefile.py
。
笔记:
- 使用二进制读取来避免编码问题
- Garenteedclosures文件(Python3.x警告这个)
- 定义
__main__
,一些脚本依赖于这个来检查它们是否被加载为一个模块,或者不是。if __name__ == "__main__"
- 设置
__file__
对于exception消息更好,一些脚本使用__file__
来获取其他文件相对于它们的path。
def exec_full(filepath): import os global_namespace = { "__file__": filepath, "__name__": "__main__", } with open(filepath, 'rb') as file: exec(compile(file.read(), filepath, 'exec'), global_namespace) # execute the file exec_full("/path/to/somefile.py")
标准的runpy.run_path是一个select。