You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用argparse捕获双短横线(--)后的所有参数

背景

许多命令行工具会对双短横线(--)之后的所有参数进行特殊处理。示例如下:

git diff:--之后的所有参数均为路径(可以-开头):

git diff [options] -- [path...]

部分包装工具会利用这一机制将任意参数传递给其包装的工具——即便这些参数可能与自身参数冲突!

foowrap -a -- -a
        🠡     🠡
        │     └───  传递给被包装工具
        └─────────  被包装工具消费
问题

如何使用argparse实现这一功能?


实现方法

argparse原生支持处理--分隔的参数,以下是两种实用方案:

  1. 用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中移除--,就能把剩余参数传递给被包装工具。

  2. 用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传递给子进程或其他工具。

  3. 注意事项

    • REMAINDER会强制停止后续参数解析,哪怕参数看起来像当前工具的选项(比如-a),完全满足包装工具的需求。
    • 如果用户未输入--,REMAINDER会捕获所有位置参数,可根据业务逻辑判断是否需要区分这种场景。

内容的提问来源于stack exchange,提问作者Jonathon Reinhart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 12:22:04