Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何记录ConfigParser的内容?_Python_Python 2.7_Logging - Fatal编程技术网

Python 如何记录ConfigParser的内容?

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

如何将Python2.7的内容
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 over
config.sections()
的回答根本无法捕获
[默认值]
部分-请对其进行测试。真的不是很理想-配置值应该比这透明得多。我同意——这种行为很奇怪!
write
方法使用类似文件的对象<代码>io.StringIO是一个类似文件的对象。因此,写入StringIO对象,然后StringIO.read()将返回您要查找的字符串。
WARNING:root:[GENERAL]
station_id = station_id

[SERIAL PORTS]
serial_ports = 
    com1
    com2
    com3