我正在使用python的configparser来读取配置信息。配置使用了一些环境变量。解析器还设置为使用插值类。问题是对于需要多步插值的变量,configparser 只调用一次插值。这是一个小例子:
# test.cfg
[VERSION]
version = 10
[PATHS]
path = ${env_some_path}/${VERSION:version}
[FINAL]
works = ${env_some_path}
fails = ${PATHS:path}
解析器代码:
# test.py
import os
import configparser
os.environ['env_some_path'] = 'some_path'
class EnvInterpolation(configparser.ExtendedInterpolation):
""" expand environment variables in values."""
def before_get(self, parser, section, option, value, defaults):
value = os.path.expandvars(value)
return super().before_get(parser, section, option, value, defaults)
config = configparser.ConfigParser(interpolation=EnvInterpolation(),
strict=False, allow_no_value=True, empty_lines_in_values=False)
config.read('test.cfg')
print(f"FINAL:works = {config.get('FINAL', 'works')}")
print(f"FINAL:fails = {config.get('FINAL', 'fails')}")
调用 config.get('FINAL', 'works') 有效并给出 some_path。 调用 config.get('FINAL', 'fails') 失败并给出错误: configparser.InterpolationMissingOptionError:错误值替换:“PATHS”部分中的选项“path”包含插值键“env_some_path”,它不是有效的选项名称。原始值:'${env_some_path}/${VERSION:version}'
问题是,对于失败的情况,调用 EnvInterpolation.before_get 的值=${PATHS:path}' 没有要扩展的环境变量。但是当解析器尝试评估 ${PATHS:path} 时,它会看到环境变量并抛出错误。
有没有办法告诉解析器在每次插值之前调用 EnvInterpolation.before_get?我如何评估这些环境变量?
谢谢