Python命令行参数处理-click包介绍

click(Command Line Interface Creation Kit)是 Python 中目前最优雅、最受欢迎的命令行工具库之一,由 Flask 的作者开发,语法简洁、文档优秀、功能强大。

安装

pip install click

Click 的核心优点

  • 全用 Python 装饰器写,几乎零样板代码
  • 自动生成 --help
  • 支持嵌套子命令(像 git、pip 那样)
  • 原生支持类型转换、默认值、提示输入
  • 和 Typer 一样现代,但更成熟、生态更好

基础用法 + 完整示例

# file: mytool.py
import click

# 主命令(可以省略函数名,直接用文件名)
@click.command()
# 位置参数(必填,按顺序传)
@click.argument("name")
@click.argument("age", type=int)
# 可选参数
@click.option("--greeting", "-g", default="Hello", help="问候语,默认 Hello")
@click.option("--times", "-n", type=int, default=1, help="重复几次")
@click.option("--shout", is_flag=True, help="是否大写喊出来")
# 带选择列表的选项
@click.option("--lang", type=click.Choice(["en", "cn", "es"]), default="cn")
def hello(name, age, greeting, times, shout, lang):
    """一个超级好用的问候工具"""
    messages = {
        "en": f"{greeting} {name}, you are {age} years old!",
        "cn": f"{greeting} {name},你今年 {age} 岁啦!",
        "es": f"¡{greeting} {name}, tienes {age} años!"
    }

    text = messages.get(lang, messages["cn"])

    if shout:
        text = text.upper() + "!!!"

    for _ in range(times):
        click.echo(text)


# 添加子命令(类似 git commit、git push)
@click.group()
def cli():
    """MyTool: 一个多功能的命令行工具集合"""
    pass

# 把上面的 hello 命令挂到 cli 下面
cli.add_command(hello)

# 再加一个子命令:计算两个数的和
@cli.command()
@click.argument("a", type=float)
@click.argument("b", type=float)
@click.option("--precision", "-p", default=2, help="保留小数位数")
def add(a, b, precision):
    """计算两个数的和"""
    result = a + b
    click.echo(f"结果: {result:.{precision}f}")

# 再加一个需要确认的危险操作
@cli.command()
@click.option("--yes", is_flag=True, help="跳过确认")
def delete_all(yes):
    """删除所有数据(演示确认功能)"""
    if not yes:
        if not click.confirm("你真的要删除所有数据吗?"):
            click.echo("已取消操作")
            return
    click.echo("所有数据已删除!(假装的)")

if __name__ == "__main__":
    cli()  # 启动命令行工具

使用方法(终端运行)

# 基本使用
python mytool.py Alice 18
# 输出: Hello Alice,你今年 18 岁啦!

# 使用选项
python mytool.py Bob 25 -g 你好 --times 3 --shout --lang cn
# 输出(大写三次):
# 你好 BOB,你今年 25 岁啦!!!

# 使用子命令
python mytool.py add 3.14159 2.71828 --precision 4
# 结果: 5.8599

# 危险操作会自动确认
python mytool.py delete-all
# 你真的要删除所有数据吗? [y/N]: n
# 已取消操作

# 跳过确认
python mytool.py delete-all --yes

# 自动帮助(超漂亮!)
python mytool.py --help
python mytool.py hello --help
python mytool.py add --help

常见好用技巧

# 让用户没输入时自动提示
@click.option("--password", prompt=True, hide_input=True, confirmation_prompt=True)

# 文件类型(自动检查文件是否存在)
@click.argument("config", type=click.Path(exists=True))

# 接收多个相同参数
@click.option("--email", "-e", multiple=True)
# 使用:--email [email protected] -e [email protected]

总结:Click 的核心装饰器

装饰器作用
@click.command()创建一个命令
@click.group()创建命令组(支持子命令)
@click.argument()位置参数(必填)
@click.option()选项参数(–flag / -f)
@click.password_option()密码输入
is_flag=True布尔开关(如 –shout)
multiple=True允许多次出现
type=click.Choice([...])限制可选值

Click 是目前 Python 生态中写命令行工具的“黄金标准”,强烈推荐所有新项目使用!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注