首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >configparser.Interpolation缺少选项错误

configparser.Interpolation缺少选项错误
EN

Stack Overflow用户
提问于 2015-10-12 12:39:33
回答 2查看 6.9K关注 0票数 4

我正在使用Argparse从配置文件中获取必要的值。

例如:

代码语言:javascript
复制
python arg.py --event_conf=/opt/open-stack-tools/track_events.conf --openstack_conf=/etc/nova/nova.conf

我需要从两个不同的文件中获取值。

我可以根据需要获得一个本地配置文件的结果。

但是,如果从nova.conf文件中获取必要的值,则会导致以下错误:

代码语言:javascript
复制
       Traceback (most recent call last):
          File "arg.py", line 36, in <module>
            oslo_messaging_rabbit= dict(config.items("oslo_messaging_rabbit"))
          File "/usr/lib/python2.7/ConfigParser.py", line 655, in items
            for option in options]
          File "/usr/lib/python2.7/ConfigParser.py", line 691, in _interpolate
            self._interpolate_some(option, L, rawval, section, vars, 1)
          File "/usr/lib/python2.7/ConfigParser.py", line 723, in _interpolate_some
            option, section, rest, var)
ConfigParser.InterpolationMissingOptionError: Bad value substitution:
        section: [oslo_messaging_rabbit]
        option : logging_exception_prefix
        key    : color
        rawval : %(asctime)s.%(msecs)03d TRACE %(name)s %(instance)s

有没有办法解决同样的问题。

我已经复制了必要的内容并创建了一个新的本地文件,我可以看到它运行良好。

当我使用nova.conf文件时,它会导致错误。

我不能更改我正在使用的文件。

所以我需要修复这个特殊的错误。

注:

根据需要添加更多详细信息:

代码语言:javascript
复制
parser.add_argument("-c", "--event_conf",
                    help="Specify config file 1", metavar="FILE")
args1, remaining_argv1 = parser.parse_known_args()


parser.add_argument("-o", "--openstack_conf",
                    help="Specify config file 2", metavar="FILE")
args2, remaining_argv2 = parser.parse_known_args()


if args1.event_conf:
    config = ConfigParser.SafeConfigParser()
    print config.read([args1.event_conf])
    config.read([args1.event_conf])
    configdetails_section1 = dict(config.items("configdetails_section1"))
EN

回答 2

Stack Overflow用户

发布于 2015-10-12 13:18:44

我找到了同样的解决方案。

实际上,问题在于我使用过的configparser解析器。

而不是SafeConfigParser,我把它改成了RawConfigParser.

这样我就能看出它运转得很好。

票数 8
EN

Stack Overflow用户

发布于 2017-08-05 16:30:02

内插允许您在定义其他配置时引用配置的值。例如,在此配置文件中:

代码语言:javascript
复制
[bug_tracker]
protocol = http
server = localhost
port = 8080
url = %(protocol)s://%(server)s:%(port)s/bugs/
username = dhellmann
password = SECRET

如果你这样读的话:

代码语言:javascript
复制
from ConfigParser import SafeConfigParser

parser = SafeConfigParser()
parser.read('interpolation.ini')

print 'value =', parser.get('bug_tracker', 'url')

你会得到:

代码语言:javascript
复制
value = http://localhost:8080/bugs/

这可能非常有用,问题似乎是在运行时传递了一些值。我的意思是你需要格式字符串来代替你自己的值。

您可以使用RawConfigParser而不是SafeConfigParser,但随后您就松开了所有的内插。

相反,您可以对一个特定值进行内插:

代码语言:javascript
复制
print 'value =', parser.get('bug_tracker', 'url', raw=True)

其结果将是:

代码语言:javascript
复制
value = %(protocol)s://%(server)s:%(port)s/bugs/

还可能需要将插值值与在计算时间内给出的一些值结合起来。例如,如果您想在计算时间内给出user,还可以将它包含到配置表达式中:

代码语言:javascript
复制
[bug_tracker]
protocol = http
server = localhost
port = 8080
url = %(protocol)s://%(user)s@%(server)s:%(port)s/bugs/
username = dhellmann
password = SECRET

然后你需要做这样的事情:

代码语言:javascript
复制
from ConfigParser import SafeConfigParser

parser = SafeConfigParser()
parser.read('interpolation.ini')

parser.set('bug_tracker', 'user', 'admin')
print 'value =', parser.get('bug_tracker', 'url')

你会得到:

代码语言:javascript
复制
value = http://admin@localhost:8080/bugs/

很抱歉我没有用你的例子。我确实在另一个项目的文档中选了一个。参见本节:结合值与插值

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33081394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档