如何用argparse向CLI参数传递等号并指定多值参数?
解决argparse中
--param=后跟空格分隔多值的问题 argparse默认解析逻辑下,--repos=这种形式会被识别为参数--repos的取值为空字符串,后面的repo1 repo2 repo3会被当作未定义的位置参数,因此抛出"unrecognized arguments"错误。要实现需求,有两种可行方案:
方案一:预处理命令行参数
直接修改传入argparse的参数列表,把--repos=替换为--repos,让argparse用标准的nargs='+'捕获后续多值:
import argparse import sys # 预处理参数,将--repos=替换为--repos processed_args = [] for arg in sys.argv[1:]: if arg == "--repos=": processed_args.append("--repos") else: processed_args.append(arg) # 初始化解析器 parser = argparse.ArgumentParser() parser.add_argument("--repos", nargs="+", default=[], help="指定多个仓库名") args = parser.parse_args(processed_args) print(args.repos) # 执行`python script.py --repos= repo1 repo2 repo3`会输出 ['repo1', 'repo2', 'repo3']
这种方法简单直接,适合只需要处理少数几个类似参数的场景。
方案二:自定义参数Action
如果需要更灵活的处理(比如多个参数都要支持这种语法),可以自定义argparse的Action类,主动捕获后续参数:
import argparse class EqualSignMultiValueAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): # 如果等号后无值(即values为空列表),则从剩余参数中收集直到遇到下一个--开头的参数 if not values: remaining_args = parser._get_args() collected_values = [] while remaining_args: current_arg = remaining_args[0] if current_arg.startswith("--"): break collected_values.append(current_arg) remaining_args.pop(0) # 更新解析器的剩余参数列表 parser._set_args(remaining_args) setattr(namespace, self.dest, collected_values) else: # 处理--repos=repo1这种带单个值的情况 setattr(namespace, self.dest, values) # 初始化解析器并使用自定义Action parser = argparse.ArgumentParser() parser.add_argument("--repos", action=EqualSignMultiValueAction, nargs="*", default=[], help="指定多个仓库名") args = parser.parse_args() print(args.repos) # 同样支持`--repos= repo1 repo2 repo3`的调用方式
自定义Action的优势在于扩展性强,能统一处理多个参数的类似需求,也可以根据需要调整参数捕获的规则(比如支持混合--repos=repo1 repo2这种写法)。
内容的提问来源于stack exchange,提问作者Vanias Kopas
相关产品推荐
相关产品推荐

