似乎他们取消了在Python 3中通过删除execfile()快速加载脚本的所有简单方法
我是否错过了一个明显的选择?
似乎他们取消了在Python 3中通过删除execfile()快速加载脚本的所有简单方法
我是否错过了一个明显的选择?
当前回答
您只需读取文件并自己执行代码。2to3电流替换
execfile("somefile.py", global_vars, local_vars)
as
with open("somefile.py") as f:
code = compile(f.read(), "somefile.py", 'exec')
exec(code, global_vars, local_vars)
(并不严格需要compile调用,但它将文件名与code对象关联起来,使调试更容易一些。)
See:
http://docs.python.org/release/2.7.3/library/functions.html#execfile http://docs.python.org/release/3.2.3/library/functions.html#compile http://docs.python.org/release/3.2.3/library/functions.html#exec
其他回答
这个更好,因为它从调用者那里获取全局变量和局部变量:
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)
正如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和目录(详细信息请参阅其文档)。
您只需读取文件并自己执行代码。2to3电流替换
execfile("somefile.py", global_vars, local_vars)
as
with open("somefile.py") as f:
code = compile(f.read(), "somefile.py", 'exec')
exec(code, global_vars, local_vars)
(并不严格需要compile调用,但它将文件名与code对象关联起来,使调试更容易一些。)
See:
http://docs.python.org/release/2.7.3/library/functions.html#execfile http://docs.python.org/release/3.2.3/library/functions.html#compile http://docs.python.org/release/3.2.3/library/functions.html#exec
如果你想要加载的脚本和你运行的脚本在同一个目录中,也许“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。
我在这里只是个新手,所以如果我发现这个,可能纯粹是运气:
尝试运行脚本后,从解释器提示>>>与命令
execfile('filename.py')
为此我得到了一个“NameError: name 'execfile' is not defined”,我尝试了一个非常基本的
import filename
它工作得很好:-)
我希望这能对你有所帮助,感谢大家提供的提示、示例和所有那些对新手有很大启发的注释代码!
我使用Ubuntu 16.014 LTS x64。Python 3.5.2(默认,2016年11月17日17:05:23) [GCC 5.4.0 20160609