Python配置解析器环境变量

4

我正在尝试将一些环境变量读入我的ConfigParser文件。

我参考了这个答案,但我得到了:

"InterpolationDepthError: Value interpolation too deeply recursive" error.
section: [amazon]
    option : amazon_access_key
    rawval : %(AMAZON_ACCESS_KEY)s

以下是我的配置文件部分内容:

[amazon]
amazon_access_key=%(AMAZON_ACCESS_KEY)s
amazon_secret_key=%(AMAZON_SECRET_KEY)s

这是我写的调用文件名的代码:

from ConfigParser import SafeConfigParser
import os

config = SafeConfigParser(os.environ)
config.read('config.txt')

当我直接在“亚马逊”部分调用这些变量时,会出现上述错误。

当我在“默认”部分中调用这些变量时,例如:

[default]
aws_access_key=%(AMAZON_ACCESS_KEY)s
aws_secret_key=%(AMAZON_SECRET_KEY)s

[amazon]
    amazon_access_key=%(aws_access_key)s
    amazon_secret_key=%(aws_secret_key)s

I get the following error:

ConfigParser.InterpolationMissingOptionError: Bad value substitution:
    section: [amazon]
    option : amazon_access_key
    key    : aws_access_key
    rawval : %(aws_access_key)s

我这里缺少了什么?

另外,我如何为本地和生产环境部署使用不同的配置文件?目前,本地和生产环境的所有配置都是相同的。


1
你尝试过使用不会遮盖原始键的环境变量名称吗?此外,您可能需要查看[amazon]部分下面的选项卡是否重要。 - Jeff Tratner
[amazon] 部分下没有选项卡。 - Ankita Gupta
2个回答

3
from ConfigParser import SafeConfigParser
import ConfigParser
import os
class CaseConfigParser(SafeConfigParser):
     def optionxform(self, optionstr):
         return optionstr
config = CaseConfigParser(os.environ)
config.read('config.ini')
print config.get('amazon', 'amazon_access_key')

解释: 这里的问题在于optionxform,默认情况下将所有选项转换为小写。最终,它将具有相等的键和值,类似于以下内容。
[amazon]
amazon_access_key=%(amazon_access_key)s

另一个解决方案可能是- 将config.txt中的键名更改为不等于环境变量的名称。
[amazon]
aak=%(AMAZON_ACCESS_KEY)s

然后

config = SafeConfigParser(os.environ)
config.read('config.ini')
print config.get('amazon', 'aak')

那么,如果我更改键的名称,这仍然有效吗?如果是这样,我就不必创建另一个类。我想避免这种情况,因为我必须在多个其他文件中调用此配置文件。 - Ankita Gupta
可能是一种猴子补丁 SafeConfigParser.optionxform = lambda self, st: st - Nikhil Rupanawar
我已经接受了这个答案,但由于我的声望较低,它没有在计数中显示。 - Ankita Gupta

-2

你应该记住默认的部分需要大写。

[DEFAULT]

进行这个更改应该可以解决问题。

更改为[DEFAULT]没有帮助。我仍然收到InterpolationMissingOptionError错误。 - Ankita Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接