看来他们在Python 3中取消了所有简单的方法,即通过删除execfile()快速加载脚本
我是否有明显的替代品?
#1楼
根据文档 ,而不是
execfile("./filename")
采用
exec(open("./filename").read())
看到:
#2楼
正如最近在python-dev邮件列表上建议的那样 , runpy模块可能是一个可行的替代方案。 引用该消息:
execfile有细微的差别:
run_path始终创建一个新的名称空间。 它作为模块执行代码,因此全局变量和init_globals变量之间没有区别(这就是为什么只有init_globals参数的原因)。 返回全局变量。
在当前名称空间或给定名称空间中执行的execfile 。 如果给出了locals和globals的语义,则它们与类定义中的locals和globals相似。
run_path不仅可以执行文件,还可以执行蛋和目录(有关详细信息,请参阅其文档)。
#3楼
这就是我所拥有的(两个示例中的文件都已使用源代码将文件分配到file的路径):
execfile(file)
这是我替换为的内容:
exec(compile(open(file).read(), file, 'exec'))
我最喜欢的部分:第二个版本在Python 2和3中都可以正常工作,这意味着不必添加依赖于版本的逻辑。
#4楼
这是更好的方法,因为它从调用者那里获取了全局变量和本地变量:
import sys
def execfile(filename, globals=None, locals=None):
if globals is None:
globals = sys._getframe(1).f_globals
if locals is None:
locals = sys._getframe(1).f_locals
with open(filename, "r") as fh:
exec(fh.read()+"\n", globals, locals)
#5楼
尽管exec(open("filename").read())通常是execfile("filename")的替代选择,但它忽略了execfile支持的重要细节。
Python3.x的以下功能与直接执行文件具有相同的行为。 匹配运行python /path/to/somefile.py 。
def execfile(filepath, globals=None, locals=None):
if globals is None:
globals = {}
globals.update({
"__file__": filepath,
"__name__": "__main__",
})
with open(filepath, 'rb') as file:
exec(compile(file.read(), filepath, 'exec'), globals, locals)
# execute the file
execfile("/path/to/somefile.py")
笔记:
使用二进制读取以避免编码问题
保证关闭文件(Python3.x警告)
定义__main__ ,某些脚本依赖于此来检查它们是否作为模块加载,例如。 if __name__ == "__main__"
对于异常消息,设置__file__更好,某些脚本使用__file__来获取其他文件相对于它们的路径。
接受可选的globals和locals参数,就像execfile一样就地对其进行修改-因此,您可以通过在运行后回读变量来访问定义的任何变量。
与Python2的execfile不同,这默认情况下不会修改当前名称空间。 为此,您必须显式传递globals()和locals() 。