Python 3中execfile的替代方法是什么?

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

有没有明显的选择我失踪?

根据文件,而不是

 execfile("./filename") 

使用

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

看到:

  • Python 3.0中的新功能

你只是应该读取文件并自己执行代码。 2to3电流取代

 execfile("somefile.py", global_vars, local_vars) 

 with open("somefile.py") as f: code = compile(f.read(), "somefile.py", 'exec') exec(code, global_vars, local_vars) 

(编译调用并不是严格需要的,但它将文件名与代码对象关联在一起,使调试更容易一些。)

看到:

正如最近在python-dev邮件列表中所建议的 , runpy模块可能是一个可行的选择。 从这个消息引用:

https://docs.python.org/3/library/runpy.html#runpy.run_path

 import runpy file_globals = runpy.run_path("file.py") 

execfile存在细微差别:

  • run_path总是创建一个新的名称空间。 它作为一个模块执行代码,所以全局和init_globals之间没有区别(这就是为什么只有一个init_globals参数)。 全局变量被返回。

    execfile在当前命名空间或给定的命名空间中执行。 如果给定的话, localsglobals的语义与类定义中的locals和globals相似。

  • run_path不仅可以执行文件,还可以执行egg和目录(详细信息请参考文档)。

你可以写你自己的功能:

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

如果你真的需要…

这一个更好,因为它从调用者的全局和本地人:

 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) 

虽然exec(open("filename").read())通常是execfile("filename")的替代方法,但是却忽略了execfile支持的一些细节。

Python3.x的以下函数尽可能地接近与直接执行文件相同的行为。 这匹配运行python /path/to/somefile.py

笔记:

  • 使用二进制读取来避免编码问题
  • 保证关闭文件(Python3.x警告这个)
  • 定义__main__ ,一些脚本依赖于这个来检查它们是否被加载为一个模块,或者不是。 if __name__ == "__main__"
  • 设置__file__对于异常消息更好,一些脚本使用__file__来获取其他文件相对于它们的路径。
  • 采用可选的全局变量和局部变量,在execfile中就地修改它们 – 这样你就可以在运行之后访问通过读回变量定义的变量。
 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") 

如果你想加载的脚本与你运行的脚本不在同一个目录下,那么“import”可以完成这个工作吗?

如果您需要动态地导入代码,内置函数__ import__和模块imp值得关注。

 >>> import sys >>> sys.path = ['/path/to/script'] + sys.path >>> __import__('test') <module 'test' from '/path/to/script/test.pyc'> >>> __import__('test').run() 'Hello world!' 

test.py:

 def run(): return "Hello world!" 

如果您使用Python 3.1或更高版本,则还应该查看importlib 。

请注意,如果您使用不是ascii或utf-8的PEP-263编码声明,上述模式将失败。 您需要找到数据的编码,并将其正确编码,然后将其交给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) 

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

 execfile(file) 

以下是我所取代的内容:

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

我最喜欢的部分:Python 2和Python 3中的第二个版本工作得很好,这意味着没有必要添加版本依赖的逻辑。

另外,虽然不是一个纯粹的Python解决方案,但是如果您使用IPython(就像您可能应该那样),您可以:

 %run /path/to/filename.py 

这同样容易。

我在这里只是一个新手,所以如果我发现这可能是纯粹的运气:

尝试从命令解释器提示符>>>运行脚本后

  execfile('filename.py') 

为此我得到了“NameError:name'execfile'没有定义”我试了一个非常基本的

  import filename 

它运作良好:-)

我希望这可以是有益的,并感谢大家的伟大的提示,例子和所有那些精心评论的代码片段,这是很大的启发新人!

我使用Ubuntu 16.014 LTS x64。 Python 3.5.2(默认,2016年11月17日,17:05:23)[GCC 5.4.0 20160609]在Linux上

找到你的文件夹安装路线(我有它在C:\ python34),然后执行一个常规的cmd shell

  set path=%path%;c:\python34 

现在当你启动一个shell时,移动到C:\ python34 \ myscripts并使用经典命令

  python filename.py