Python argparse库高级用法:子命令与多级参数解析
·
Python argparse 库高级用法:子命令与多级参数解析
argparse 是 Python 处理命令行参数的标准库,其子命令功能可实现类似 git commit、docker 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
高级技巧
-
参数继承:通过
parents参数实现公共参数复用base_parser = argparse.ArgumentParser(add_help=False) base_parser.add_argument("--config", default="config.ini") subparsers.add_parser("deploy", parents=[base_parser]) -
自定义类型验证
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) -
参数依赖检查
args = parser.parse_args() if args.command == "build" and args.debug and args.optimize > 1: parser.error("调试模式不能使用高级优化")
此模式适用于需要复杂命令结构的工具开发,能有效组织代码逻辑,提供清晰的用户指引。
更多推荐


所有评论(0)