Python argparse 库高级用法:子命令与多级参数解析

argparse 是 Python 处理命令行参数的标准库,其子命令功能可实现类似 git commitdocker build 的多级命令结构。以下展示高级实现技巧:

基础子命令结构
import argparse

# 创建主解析器
parser = argparse.ArgumentParser(prog="CLI-Tool")
subparsers = parser.add_subparsers(dest="command", required=True)

# 创建子命令 "init"
init_parser = subparsers.add_parser("init", help="初始化项目")
init_parser.add_argument("--name", required=True, help="项目名称")

# 创建子命令 "build"
build_parser = subparsers.add_parser("build", help="构建项目")
build_parser.add_argument("--output", "-o", default="dist", help="输出目录")

# 解析参数
args = parser.parse_args()

多级参数嵌套
# 主解析器全局参数
parser.add_argument("--verbose", "-v", action="store_true")

# 在 build 子命令下添加二级参数组
build_group = build_parser.add_argument_group("编译选项")
build_group.add_argument("--optimize", type=int, choices=[0,1,2])
build_group.add_argument("--debug", action="store_true")

# 添加互斥参数组
exclusive_group = build_parser.add_mutually_exclusive_group()
exclusive_group.add_argument("--fast", action="store_true")
exclusive_group.add_argument("--safe", action="store_true")

动态参数绑定
# 为子命令绑定处理函数
def handle_init(args):
    print(f"初始化项目: {args.name}")

def handle_build(args):
    mode = "fast" if args.fast else "safe" if args.safe else "normal"
    print(f"构建模式: {mode}, 优化级别: {args.optimize}")

# 关联函数与子命令
init_parser.set_defaults(func=handle_init)
build_parser.set_defaults(func=handle_build)

# 执行对应函数
args = parser.parse_args()
args.func(args)

使用示例
# 初始化项目
$ python cli.py init --name ProjectA

# 构建项目(启用快速模式)
$ python cli.py build --optimize 2 --fast -v

# 错误示例(互斥参数冲突)
$ python cli.py build --fast --safe
usage: cli.py build [-h] [--output OUTPUT] [--optimize {0,1,2}] [--debug] 
                   (--fast | --safe)
cli.py build: error: argument --safe: not allowed with argument --fast

高级技巧
  1. 参数继承:通过 parents 参数实现公共参数复用

    base_parser = argparse.ArgumentParser(add_help=False)
    base_parser.add_argument("--config", default="config.ini")
    
    subparsers.add_parser("deploy", parents=[base_parser])
    

  2. 自定义类型验证

    def valid_port(value):
        port = int(value)
        if not (1024 < port < 65535):
            raise argparse.ArgumentTypeError("无效端口号")
        return port
    
    build_parser.add_argument("--port", type=valid_port)
    

  3. 参数依赖检查

    args = parser.parse_args()
    if args.command == "build" and args.debug and args.optimize > 1:
        parser.error("调试模式不能使用高级优化")
    

此模式适用于需要复杂命令结构的工具开发,能有效组织代码逻辑,提供清晰的用户指引。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐