如何使用argparse捕获双短横线(--)后的所有参数
背景
许多命令行工具会对双短横线(--)之后的所有参数进行特殊处理。示例如下:
git diff:--之后的所有参数均为路径(可以-开头):
git diff [options] -- [path...]
部分包装工具会利用这一机制将任意参数传递给其包装的工具——即便这些参数可能与自身参数冲突!
foowrap -a -- -a 🠡 🠡 │ └─── 传递给被包装工具 └───────── 被包装工具消费
问题
如何使用argparse实现这一功能?
实现方法
argparse原生支持处理--分隔的参数,以下是两种实用方案:
用
argparse.REMAINDER捕获所有后续参数
定义一个位置参数并将nargs设为argparse.REMAINDER,argparse会自动停止解析--及之后的所有内容,完整捕获这些参数:import argparse parser = argparse.ArgumentParser() parser.add_argument('-a', action='store_true', help='当前工具的参数') # 捕获--之后的所有内容 parser.add_argument('pass_through', nargs=argparse.REMAINDER) args = parser.parse_args(['-a', '--', '-a', '--target', '/path']) print(args) # 输出: Namespace(a=True, pass_through=['--', '-a', '--target', '/path'])后续只需从
pass_through中移除--,就能把剩余参数传递给被包装工具。用
parse_known_args()分离参数
先解析当前工具的已知参数,未被解析的部分就是--之后的内容:import argparse parser = argparse.ArgumentParser() parser.add_argument('-a', action='store_true') args, pass_through = parser.parse_known_args(['-a', '--', '-a', '/path']) print(args) # 输出: Namespace(a=True) print(pass_through) # 输出: ['--', '-a', '/path']同样,去掉
--后即可将pass_through传递给子进程或其他工具。注意事项
REMAINDER会强制停止后续参数解析,哪怕参数看起来像当前工具的选项(比如-a),完全满足包装工具的需求。- 如果用户未输入
--,REMAINDER会捕获所有位置参数,可根据业务逻辑判断是否需要区分这种场景。
内容的提问来源于stack exchange,提问作者Jonathon Reinhart
相关产品推荐
相关产品推荐

