我有一个包含序言信息的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"有什么不对,如何解决这个问题?
发布于 2014-02-28 21:49:17
您需要将全局字典传递给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-28 21:55:50
这里的问题是调用execfile()时代码运行的名称空间。如果您研究这些文档,您将看到execfile()可以使用两个命名空间参数来表示代码的全局和本地名称空间。
在模块级别(即,当execfile()调用不是来自函数内部时),则模块全局命名空间将用于这两个命名空间。从函数内部,模块全局作为全局命名空间,本地命名空间是函数调用命名空间(通常在调用返回时消失)。
因此,由于赋值优先绑定本地名称空间中的名称,执行该文件将在函数调用命名空间中设置前导,因此在模块级别上找不到它。
如果您的配置文件确实是Python,那么只导入它们就不可能了,还是有什么组织上的原因导致它不能工作呢?这样,您就可以只使用import config,然后在代码中引用config.PREAMBLE。
https://stackoverflow.com/questions/22106377
复制相似问题