在Python的方法中执行execfile()

时间:2014-02-28 21:42:12

标签: python configuration execfile

我有一个具有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"

有什么问题以及如何解决这个问题?

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:2)

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

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

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

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