似乎他们取消了在Python 3中通过删除execfile()快速加载脚本的所有简单方法
我是否错过了一个明显的选择?
似乎他们取消了在Python 3中通过删除execfile()快速加载脚本的所有简单方法
我是否错过了一个明显的选择?
当前回答
这是我所拥有的(在两个例子中,file已经被分配到带有源代码的文件的路径):
execfile(file)
下面是我用它替换的:
exec(compile(open(file).read(), file, 'exec'))
我最喜欢的部分是:第二个版本在Python 2和3中都工作得很好,这意味着不需要添加版本相关的逻辑。
其他回答
如果你想要加载的脚本和你运行的脚本在同一个目录中,也许“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。
你可以写自己的函数:
def xfile(afile, globalz=None, localz=None):
with open(afile, "r") as fh:
exec(fh.read(), globalz, localz)
如果你真的需要…
正如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和目录(详细信息请参阅其文档)。
此外,虽然不是纯Python解决方案,但如果你正在使用IPython(无论如何你可能应该这样做),你可以:
%run /path/to/filename.py
这同样简单。
根据文档,而不是
execfile("./filename")
Use
exec(open("./filename").read())
See:
Python 3.0有什么新特性