2

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

execfile("config.py")
print PREAMBLE
>>> "ABC"

但是,当在方法中调用 execfile() 时,出现错误。

def a():
    execfile("config.py")
    print PREAMBLE

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

出了什么问题以及如何解决此问题?

4

2 回答 2

5

您需要通过全局字典来execfile达到相同的结果:

def a():
    execfile("config.py",globals())
    print PREAMBLE

a()
>>> "some string"

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

def a():
    config = dict()
    execfile('/tmp/file',config)
    print config['PREAMBLE']

a()
>>> "some string"

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

于 2014-02-28T21:49:17.447 回答
2

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

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

因此,由于分配优先绑定本地命名空间中的名称,因此执行文件会在函数调用命名空间内设置 PREAMBLE,因此无法在模块级别找到它。

如果你的配置文件真的是 Python,难道不能只导入它们,还是有一些组织原因导致它不起作用?这样你就可以import config然后config.PREAMBLE在你的代码中引用。

于 2014-02-28T21:55:50.003 回答