我有一个具有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"
有什么问题以及如何解决这个问题?
答案 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
。