configparser读取含%(message)s的配置值失败,求正确读取使用方法
解决configparser读取%(message)s时的InterpolationMissingOptionError错误
问题原因
Python的configparser默认启用基础插值(BasicInterpolation),会把%(xxx)s格式的字符串当成对配置文件中其他选项的引用。当读取LOGS_FORMATTER: %(message)s时,它会尝试寻找名为message的配置选项,找不到就抛出InterpolationMissingOptionError。
三种可行解决方案
1. 初始化ConfigParser时禁用插值
创建ConfigParser实例时,显式设置interpolation=None,彻底关闭插值功能:
reloaded_config = configparser.ConfigParser(interpolation=None)
2. 使用RawConfigParser替代ConfigParser
RawConfigParser是ConfigParser的父类,默认不做任何插值处理,适合不需要引用其他配置项的场景:
reloaded_config = configparser.RawConfigParser()
3. 转义百分号(写入配置时处理)
如果需要保留默认插值功能,只是要让%(message)s被原样读取,可以在写入配置时把百分号转义为%%,读取后会自动还原成单个%:
修改写入配置的代码片段:
config['APP'] = { # ...其他配置项 'LOGS_FORMATTER': '%%(message)s', # ...其他配置项 }
修改后的完整代码示例(以禁用插值为例)
import configparser config = configparser.ConfigParser() config['APP'] = { 'CERTS_PATH': './certs/', 'DATA_PATH': './data/', 'LOGS_PATH': './logs/', 'LOGS_FORMATTER': '%(message)s', 'LOCAL_ISSUES_FILE_SUFFIX': 'issues.json', 'MAX_RESULTS': '100', } with open('config.ini', 'w') as configfile: config.write(configfile) # 关键修改:禁用插值 reloaded_config = configparser.ConfigParser(interpolation=None) reloaded_config.read('config.ini') for _section in reloaded_config.sections(): print(f"[{_section}]") for _key in reloaded_config[_section]: _value = reloaded_config[_section][_key] print(f"{_key} = {_value}")
运行这段代码后,就能正常读取%(message)s并输出,不会再抛出错误。
内容的提问来源于stack exchange,提问作者JuanPablo Jofre
相关产品推荐
相关产品推荐

