argparse通过add_subparsers()支持子命令结构:1.用dest指定子命令属性名创建容器;2.为各子命令添加独立解析器并设参数;3.用set_defaults(func=...)绑定处理函数,统一调用args.func(args)执行;4.需设required=True强制子命令,避免父解析器与子命令参数冲突。
argparse 支持通过 add_subparsers() 方法实现类似 git add、git commit 这样的子命令结构,核心是创建一个“子解析器容器”,再为每个子命令添加独立的 ArgumentParser 实例。
调用 add_subparsers(dest=...) 创建子命令入口,dest 指定解析后存储子命令名的属性名(必需,否则报错):
import argparseparser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='command') # 注意:dest 是必须的
用 subparsers.add_parser('name', ...) 添加子命令解析器,可单独设置帮助文本、描述等:
add_parser('add', help='Add files to staging')add_parser('commit', help='Record changes to the repository')
ArgumentParser,可自由添加参数例如:
add_parser = subparsers.add_parser('add', help='Add files to staging')
add_parser.add_argument('files', nargs='+', help='Files to add')
commit_parser = subparsers.add_parser('commit', help='Record changes')
commit_parser.add_argument('-m', '--message', required=True, help='Commit message')
调用 parse_args() 后,结果对象会包含 command 属性(值为子命令名),再根据该值调用对应处理函数:
args = parser.parse_args()if args.command == 'add': print(f"Adding: {args.files}") elif args.command == 'commit': print(f"Committing with message: {args.message}")
更推荐的方式是直接在子解析器上设置 set_defaults(func=...),然后统一调用:
add_parser.set_defaults(func=lambda a: print(f"Add: {a.files}"))
commit_parser.set_defaults(func=lambda a: print(f"Commit: {a.message}"))
args = parser.parse_args()
if hasattr(args, 'func'):
args.func(args)
else:
parser.print_help()
add_subparsers() 默认是可选的(即不输子命令也不报错),如需强制指定,加 required=True(Python 3.7+;旧版本可用 metavar='command' + 手动检查)help 参数控制 python script.py -h 中该子命令的简短说明-h 会显示其专属参数帮助,例如 python script.py add -h