2014-02-28 25 views
2

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

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

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

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

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

怎么了,怎么解决这个问题?

回答

4

您需要通过全球字典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"

+0

请注意,从任何进口; a()'不会将'PREAMBLE'加载到当前名称空间中,因为它使用'a'的全局字典而不是任何叫它的全局字典。 – user2357112

2

这里的问题是调用execfile()时代码在其中运行的命名空间。如果学习文档,您会看到execfile()可以带两个名称空间参数来表示用于执行代码的全局名称空间和本地名称空间。

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

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

如果你的配置文件真的是Python,是不是可能只是导入它们,或者是有一些组织的原因,为什么不起作用?这样你可以只需import config,然后在代码中参考config.PREAMBLE