Python 如何记录ConfigParser的内容?
如何将Python2.7的内容Python 如何记录ConfigParser的内容?,python,python-2.7,logging,Python,Python 2.7,Logging,如何将Python2.7的内容ConfigParser打印到日志中 我能找到的唯一解决方案是写入一个临时文件,然后将该文件读回。我的另一个想法是从日志实用程序获取一个假的“文件句柄”,并将其传递给ConfigParser write方法,但我不知道如何从日志中获取这样的句柄。您应该能够创建一个写入日志的可写对象。类似这样的内容(如果您想保留字符串,可以修改ConfigLogger以保存它): 这将产生以下输出: INFO:root:Config: INFO:root:[test] INFO:ro
ConfigParser
打印到日志中
我能找到的唯一解决方案是写入一个临时文件,然后将该文件读回。我的另一个想法是从日志实用程序获取一个假的“文件句柄”,并将其传递给ConfigParser write方法,但我不知道如何从日志中获取这样的句柄。您应该能够创建一个写入日志的可写对象。类似这样的内容(如果您想保留字符串,可以修改ConfigLogger以保存它):
这将产生以下输出:
INFO:root:Config:
INFO:root:[test]
INFO:root:a = 1
INFO:root:
由于这是Google的顶级搜索结果,我希望找到一种将ConfigParser
实例的值打印到stdout的解决方案,因此这里有一个简单的例子可以帮助所有未来的读者:
print({section:dict(config[section])用于config.sections()中的section)
只需使用StringIO对象和configparser的写入方法即可
看起来唯一“打印”配置对象内容的方法是ConfigParser.write
,它接受类似文件的对象<代码>io.StringIO是一个类似文件的对象。因此,将配置写入StringIO对象,然后将StringIO对象读入字符串
import logging
import io
import configparser
if __name__ == "__main__":
ini='''
[GENERAL]
station_id = station_id
[SERIAL PORTS]
serial_ports =
com1
com2
com3
'''
cp = configparser.ConfigParser()
cp.read_string(ini)
with io.StringIO() as ss:
cp.write(ss)
ss.seek(0) # rewind
logging.warning(ss.read())
输出:
WARNING:root:[GENERAL]
station_id = station_id
[SERIAL PORTS]
serial_ports =
com1
com2
com3
啊,我明白了。因此,只要传递给ConfigParser.write的对象有自己的写函数,它就会调用它?很遗憾,您无法从盒子中取出信息日志编写器对象。我不确定它是否是Python2 vs 3,但在Python2.7中,我必须使用config.items(section)
。假设已导入pprint:pprint.pprint({section:dict(config.items(section))for config.sections()})
注意:由于未知原因,这不会捕获[默认值]
节。可能是<代码> ConfigParser <代码>不认为默认是它自己的部分的一部分,尽管在获取值时必须将代码> [默认] < /代码>作为一个区段访问。另一种选择:<代码> CONFIG.CODE(sys .STDUT)这是非常令人震惊的,即使在2020,ConfigParser
没有简单的方法获取用于日志记录的所有值。所有答案都非常神秘或无法捕获所有配置(例如,迭代部分跳过[默认]
)。@bsplosion默认Python 2或3语法中的字典理解是神秘的?@SeanPianka更多的是配置解析器
用于解析和访问配置值,对吗?然而,正如我在您回复的评论中提到的,您使用dict comprehension overconfig.sections()
的回答根本无法捕获[默认值]
部分-请对其进行测试。真的不是很理想-配置值应该比这透明得多。我同意——这种行为很奇怪!write
方法使用类似文件的对象<代码>io.StringIO是一个类似文件的对象。因此,写入StringIO对象,然后StringIO.read()将返回您要查找的字符串。
WARNING:root:[GENERAL]
station_id = station_id
[SERIAL PORTS]
serial_ports =
com1
com2
com3