Mur*_*ali 3 python configparser
我正在使用Argparse从配置文件中获取必要的值。
例如:
python arg.py --event_conf=/opt/open-stack-tools/track_events.conf --openstack_conf=/etc/nova/nova.conf
Run Code Online (Sandbox Code Playgroud)
我需要从两个不同的文件中获取值。
我可以根据需要获取一个本地配置文件的结果。
但是,如果从nova.conf文件中获取必要的值,则会导致以下错误:
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
Run Code Online (Sandbox Code Playgroud)
有没有办法解决相同的问题。
我已经复制了必要的内容并创建了一个新的本地文件,我可以看到它运行正常。
当我使用nova.conf文件时,将导致错误。
我无法更改正在使用的文件。
因此,我需要针对特定错误的修复程序。
注意:
根据需要添加更多详细信息:
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"))
Run Code Online (Sandbox Code Playgroud)
我找到了相同的解决方案。
实际的问题是我使用过的configparser。
而不是SafeConfigParser,我将其更改为RawConfigParser。
然后我可以看到它运行正常。
插值允许您在定义其他配置时参考配置值。例如,在这个配置文件中:
[bug_tracker]
protocol = http
server = localhost
port = 8080
url = %(protocol)s://%(server)s:%(port)s/bugs/
username = dhellmann
password = SECRET
Run Code Online (Sandbox Code Playgroud)
如果你是这样读的:
from ConfigParser import SafeConfigParser
parser = SafeConfigParser()
parser.read('interpolation.ini')
print 'value =', parser.get('bug_tracker', 'url')
Run Code Online (Sandbox Code Playgroud)
你会得到:
value = http://localhost:8080/bugs/
Run Code Online (Sandbox Code Playgroud)
这可能非常有用,问题似乎是您在运行时传递了一些值。我的意思是您需要格式字符串来实际替换您自己的值。
您可以使用RawConfigParser而不是,SafeConfigParser但是您会丢失所有插值。
相反,您可以抑制一个特定值的插值:
print 'value =', parser.get('bug_tracker', 'url', raw=True)
Run Code Online (Sandbox Code Playgroud)
结果将是:
value = %(protocol)s://%(server)s:%(port)s/bugs/
Run Code Online (Sandbox Code Playgroud)
您还可能需要将内插值与评估时间中给出的某些值相结合。例如,如果您想给出userin 评估时间,您还可以将其包含在配置表达式中:
[bug_tracker]
protocol = http
server = localhost
port = 8080
url = %(protocol)s://%(user)s@%(server)s:%(port)s/bugs/
username = dhellmann
password = SECRET
Run Code Online (Sandbox Code Playgroud)
然后你需要做这样的事情:
from ConfigParser import SafeConfigParser
parser = SafeConfigParser()
parser.read('interpolation.ini')
parser.set('bug_tracker', 'user', 'admin')
print 'value =', parser.get('bug_tracker', 'url')
Run Code Online (Sandbox Code Playgroud)
你会得到:
value = http://admin@localhost:8080/bugs/
Run Code Online (Sandbox Code Playgroud)
抱歉,我没有使用您的示例。我确实在另一个项目的文档中使用了它。请参阅部分:将值与插值相结合
| 归档时间: |
|
| 查看次数: |
2885 次 |
| 最近记录: |