似乎他们取消了在Python 3中通过删除execfile()快速加载脚本的所有简单方法

我是否错过了一个明显的选择?


当前回答

这是我所拥有的(在两个例子中,file已经被分配到带有源代码的文件的路径):

execfile(file)

下面是我用它替换的:

exec(compile(open(file).read(), file, 'exec'))

我最喜欢的部分是:第二个版本在Python 2和3中都工作得很好,这意味着不需要添加版本相关的逻辑。

其他回答

正如python-dev邮件列表最近建议的那样,runpy模块可能是一个可行的替代方案。引用这条信息:

https://docs.python.org/3/library/runpy.html#runpy.run_path 进口runpy File_globals = runpy.run_path("file.py")

execfile有一些细微的区别:

Run_path总是创建一个新的名称空间。它将代码作为模块执行,因此全局变量和局部变量之间没有区别(这就是为什么只有init_globals参数)。返回全局变量。 在当前命名空间或给定命名空间中执行的Execfile。局部变量和全局变量的语义与类定义中的局部变量和全局变量相似。 Run_path不仅可以执行文件,还可以执行eggs和目录(详细信息请参阅其文档)。

注意,如果使用PEP-263编码声明,上述模式将失败 不是ASCII或utf-8。您需要找到数据的编码,并对其进行编码 在将其交给exec()之前。

class python3Execfile(object):
    def _get_file_encoding(self, filename):
        with open(filename, 'rb') as fp:
            try:
                return tokenize.detect_encoding(fp.readline)[0]
            except SyntaxError:
                return "utf-8"

    def my_execfile(filename):
        globals['__file__'] = filename
        with open(filename, 'r', encoding=self._get_file_encoding(filename)) as fp:
            contents = fp.read()
        if not contents.endswith("\n"):
            # http://bugs.python.org/issue10204
            contents += "\n"
        exec(contents, globals, globals)

这是我所拥有的(在两个例子中,file已经被分配到带有源代码的文件的路径):

execfile(file)

下面是我用它替换的:

exec(compile(open(file).read(), file, 'exec'))

我最喜欢的部分是:第二个版本在Python 2和3中都工作得很好,这意味着不需要添加版本相关的逻辑。

根据文档,而不是

execfile("./filename") 

Use

exec(open("./filename").read())

See:

Python 3.0有什么新特性

你可以写自己的函数:

def xfile(afile, globalz=None, localz=None):
    with open(afile, "r") as fh:
        exec(fh.read(), globalz, localz)

如果你真的需要…