如何使用Python的argparse解析嵌套式build_config参数?
实现支持多组
--build_config的命令行参数解析 问题分析
需要支持重复使用--build_config选项,每个选项后跟随键值对参数,其中flavors可以接收多个值,其他参数为单值。argparse默认的参数处理无法直接满足这种嵌套+多值的需求,需要额外的解析逻辑。
解决方案代码
import argparse def parse_build_configs(config_groups): parsed_configs = [] for group in config_groups: config = {} current_key = None for item in group: if '=' in item: # 处理键值对 key, value = item.split('=', 1) current_key = key config[key] = value else: # 处理多值参数(仅flavors) if current_key != 'flavors': raise ValueError(f"Unexpected value '{item}' for non-multi-value key '{current_key}'") # 将值转为列表或追加到现有列表 if isinstance(config[current_key], list): config[current_key].append(item) else: config[current_key] = [config[current_key], item] parsed_configs.append(config) return parsed_configs # 初始化argparse解析器 parser = argparse.ArgumentParser(description="Parse multi-group build configurations") parser.add_argument('--build_config', nargs='+', action='append', required=True, help="Build configuration group, e.g. target=product1 flavors=A B C") # 解析命令行参数 args = parser.parse_args() # 处理并转换build_config参数 build_configs = parse_build_configs(args.build_config) # 验证结果(示例) for idx, cfg in enumerate(build_configs, 1): print(f"=== Build Config {idx} ===") for key, val in cfg.items(): print(f"{key}: {val}")
代码说明
argparse配置:
- 使用
action='append'让--build_config可以重复使用,每次的参数被收集为一个子列表 - 使用
nargs='+'让每个--build_config后可以接收多个参数(键值对或多值)
- 使用
自定义解析逻辑:
- 遍历每个
--build_config组的参数,区分带=的键值对和后续的多值 - 仅允许
flavors接收多值,其他参数出现多值会抛出错误(可根据需求调整) - 将
flavors的多个值整理为列表,其他参数保持单值
- 遍历每个
测试示例
测试命令1
python3 some_script.py --build_config target=product1 step=x rom=y flavors=A B C
输出1
=== Build Config 1 === target: product1 step: x rom: y flavors: ['A', 'B', 'C']
测试命令2
python3 some_script.py --build_config target=product1 flavors=A --build_config target=product2 flavors=B C
输出2
=== Build Config 1 === target: product1 flavors: ['A'] === Build Config 2 === target: product2 flavors: ['B', 'C']
内容的提问来源于stack exchange,提问作者VinayChoudhary99
相关产品推荐
相关产品推荐

