无需修改test.conf的Python实现bash配置变量替换方案
纯Python实现bash风格配置文件变量替换方案
实现思路
- 逐行读取配置文件,自动过滤空行和bash风格注释行,兼容现有配置格式无需修改
- 先提取所有
KEY=VALUE格式的键值对存入字典,保留原始值 - 迭代匹配
${变量名}格式的占位符,用已解析的变量值替换,直到所有占位符处理完成,支持多层变量嵌套引用 - 完全原生Python实现,无需依赖外部子进程调用bash
示例代码
import re def parse_bash_conf(file_path): # 匹配${VAR}格式的变量引用,需要支持$VAR格式可修改正则规则 var_pattern = re.compile(r'\$\{(\w+)\}') conf_dict = {} # 第一步:读取所有原始键值对 with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() # 跳过空行和注释行 if not line or line.startswith('#'): continue key, value = line.split('=', 1) conf_dict[key.strip()] = value.strip() # 第二步:替换所有变量引用,加最大迭代次数避免循环引用死循环 updated = True max_iter = 10 iter_count = 0 while updated and iter_count < max_iter: updated = False iter_count += 1 for key, value in conf_dict.items(): matches = var_pattern.findall(value) for var in matches: if var in conf_dict: value = value.replace(f'${{{var}}}', conf_dict[var]) updated = True conf_dict[key] = value return conf_dict # 调用测试 if __name__ == '__main__': conf = parse_bash_conf('test.conf') print(conf) # 输出结果:{'IP_BASE': '10.22.1', 'IP_NET': '10.22.1.0', 'IP_HOST': '10.22.1.1'}
方案优势
- 无需修改现有
test.conf的任何内容,完全兼容原有bash格式 - 无外部依赖,执行效率高于调用subprocess启动bash进程的方案
- 可扩展性强,需要支持其他bash变量语法(如默认值、无大括号的$VAR格式)只需调整正则匹配和替换逻辑即可
内容的提问来源于stack exchange,提问作者Fang
相关产品推荐
相关产品推荐

