首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python在方法中执行execfile()

用Python在方法中执行execfile()
EN

Stack Overflow用户
提问于 2014-02-28 21:42:11
回答 2查看 2.5K关注 0票数 3

我有一个包含序言信息的config.py脚本。我可以使用execfile()函数读取配置文件的内容。

代码语言:javascript
复制
execfile("config.py")
print PREAMBLE
>>> "ABC"

但是,当在方法中调用execfile()时,我有一个错误。

代码语言:javascript
复制
def a():
    execfile("config.py")
    print PREAMBLE

a()
>>> NameError: "global name 'PREAMBLE' is not defined"

有什么不对,如何解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-28 21:49:17

您需要将全局字典传递给execfile以获得相同的结果:

代码语言:javascript
复制
def a():
    execfile("config.py",globals())
    print PREAMBLE

a()
>>> "some string"

如果您不想污染您的全局命名空间,可以传递一个本地字典并使用它:

代码语言:javascript
复制
def a():
    config = dict()
    execfile('/tmp/file',config)
    print config['PREAMBLE']

a()
>>> "some string"

作为参考,在上述两种情况下,/tmp/file都包含PREAMBLE = "some string"

票数 6
EN

Stack Overflow用户

发布于 2014-02-28 21:55:50

这里的问题是调用execfile()时代码运行的名称空间。如果您研究这些文档,您将看到execfile()可以使用两个命名空间参数来表示代码的全局和本地名称空间。

在模块级别(即,当execfile()调用不是来自函数内部时),则模块全局命名空间将用于这两个命名空间。从函数内部,模块全局作为全局命名空间,本地命名空间是函数调用命名空间(通常在调用返回时消失)。

因此,由于赋值优先绑定本地名称空间中的名称,执行该文件将在函数调用命名空间中设置前导,因此在模块级别上找不到它。

如果您的配置文件确实是Python,那么只导入它们就不可能了,还是有什么组织上的原因导致它不能工作呢?这样,您就可以只使用import config,然后在代码中引用config.PREAMBLE

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22106377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档