哪个更适合为Python程序,内置模块(ConfigParser)或独立项目(ConfigObj)创建设置文件?
我在python中使用ConfigObj进行模板式插值.通过**展开我的配置字典似乎不进行插值.这是一个功能还是一个bug?有什么好的解决方法吗?
$ cat my.conf
foo = /test
bar = $foo/directory
>>> import configobj
>>> config = configobj.ConfigObj('my.conf', interpolation='Template')
>>> config['bar']
'/test/directory'
>>> '{bar}'.format(**config)
'$foo/directory'
Run Code Online (Sandbox Code Playgroud)
我希望第二行是/test/directory.为什么插值不能用**kwargs?
我正在尝试使用StringIO来提供ConfigObj.我想在单元测试中执行此操作,以便我可以动态地模拟配置"文件",具体取决于我要在配置对象中测试的内容.
我在配置模块中有很多事情要处理(我正在阅读其他应用程序的几个conf文件,聚合和"格式化"信息).但是,在测试中,我面临着来自地狱的unicode错误.我想我已经把我的问题归结为最小的功能代码,我已经提取并过度简化了这个问题的目的.
我正在做以下事情:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import configobj
import io
def main():
"""Main stuff"""
input_config = """
[Header]
author = PloucPlouc
description = Test config
[Study]
name_of_study = Testing
version = 9999
"""
# Just not to trust my default encoding
input_config = unicode(input_config, "utf-8")
test_config_fileio = io.StringIO(input_config)
print configobj.ConfigObj(infile=test_config_fileio, encoding="UTF8")
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
它产生以下回溯:
Traceback (most recent call last):
File "test_configobj.py", line 101, in <module>
main()
File "test_configobj.py", line 98, in …Run Code Online (Sandbox Code Playgroud) 因此,我尝试在配置文件中使用字典来将报告名称存储到 API 调用中。所以像这样:
report = {'/report1': '/https://apicall...', '/report2': '/https://apicall...'}
Run Code Online (Sandbox Code Playgroud)
我需要存储多个报告:对一个配置值的 API 调用。我正在使用 ConfigObj。我读过那里的文档,文档说我应该能够做到。我的代码看起来像这样:
from configobj import ConfigObj
config = ConfigObj('settings.ini', unrepr=True)
for x in config['report']:
# do something...
print x
Run Code Online (Sandbox Code Playgroud)
然而,当它到达 config= 时,它会抛出一个引发错误。我有点迷失在这里。我什至复制并粘贴了他们的示例和相同的内容“引发错误”。我正在使用 python27 并安装了 configobj 库。
configobj ×4
python ×4
config ×1
configparser ×1
dictionary ×1
kwargs ×1
python-2.7 ×1
unicode ×1