似乎他们取消了在Python 3中通过删除execfile()快速加载脚本的所有简单方法
我是否错过了一个明显的选择?
似乎他们取消了在Python 3中通过删除execfile()快速加载脚本的所有简单方法
我是否错过了一个明显的选择?
当前回答
这是我所拥有的(在两个例子中,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)
如果你真的需要…
我在这里只是个新手,所以如果我发现这个,可能纯粹是运气:
尝试运行脚本后,从解释器提示>>>与命令
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
这是我所拥有的(在两个例子中,file已经被分配到带有源代码的文件的路径):
execfile(file)
下面是我用它替换的:
exec(compile(open(file).read(), file, 'exec'))
我最喜欢的部分是:第二个版本在Python 2和3中都工作得很好,这意味着不需要添加版本相关的逻辑。
如果可以,请避免使用exec()。对于大多数应用程序,使用Python的导入系统更简洁。
这个函数使用内置的importlib来执行一个文件作为一个实际的模块:
from importlib import util
def load_file_as_module(name, location):
spec = util.spec_from_file_location(name, location)
module = util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
使用的例子
让我们有一个文件foo.py:
def hello():
return 'hi from module!'
print('imported from', __file__, 'as', __name__)
并将其作为常规模块导入:
>>> mod = load_file_as_module('mymodule', './foo.py')
imported from /tmp/foo.py as mymodule
>>> mod.hello()
hi from module!
>>> type(mod)
<class 'module'>
优势
这种方法不会污染名称空间或破坏$PATH,而exec()则直接在当前函数的上下文中运行代码,可能会导致名称冲突。同样,模块属性如__file__和__name__将被正确设置,代码位置将被保留。因此,如果你附加了一个调试器,或者模块引发了一个异常,你将得到可用的回溯。
注意,与静态导入的一个微小区别是,每次运行load_file_as_module()时,模块都会被导入(执行),而不是像import关键字那样只导入一次。