跳转至

Python 命令行工具

Abstract

在 Python 中,构建命令行工具(CLI)主要有三种常见方案:argparseClickTyper

  • argparse 是标准库,功能稳定但写法较为传统
  • Click 提供了更结构化的方式,适合中大型 CLI 项目
  • Typer 基于类型注解,语法简洁,是现代推荐方案

三者的核心区别在于:开发体验、代码简洁度以及适用场景。本文对它们进行简单对比与总结。

argparse(标准库)

argparse 是 Python 标准库中用于解析命令行参数的模块,无需额外安装。 它支持位置参数、可选参数、类型转换以及自动生成帮助信息,适合编写简单脚本或对依赖较敏感的命令行工具。

特点:

  • Python 内置,无需额外依赖
  • 支持参数解析与类型校验
  • 可自动生成 -h/--help 帮助信息
  • 写法相对传统,代码通常比 Typer 更繁琐
import argparse

# 创建解析器对象
parser = argparse.ArgumentParser(description='一个简单的示例程序')

# 添加参数
parser.add_argument('--name', type=str, help='输入你的名字')
parser.add_argument('--age', type=int, help='输入你的年龄')

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

# 使用参数
print(f'你好, {args.name}!')
print(f'你的年龄是: {args.age}')

Click

Click 是一个用于构建命令行工具的第三方库,提供了比 argparse 更简洁和结构化的写法。 它通过装饰器定义命令和参数,支持子命令、参数类型校验以及自动生成帮助信息,适合开发中大型 CLI 工具。

特点:

  • 基于装饰器,代码结构清晰
  • 支持子命令(类似 git)
  • 自动生成命令行帮助信息
  • 功能强大,生态成熟
import click

@click.command()
@click.option("--name", help="User name")
def hello(name):
    print(f"Hello, {name}")

if __name__ == "__main__":
    hello()

Typer

Typer 是一个基于类型注解(type hints)的现代 Python CLI 框架,构建在 Click 之上。 它通过函数签名自动解析参数,并生成友好的帮助信息,使代码更加简洁直观,适合快速开发命令行工具。

特点:

  • 基于类型注解,参数定义简洁
  • 自动生成清晰的帮助文档
  • 支持自动补全(shell autocomplete)
  • 底层基于 Click,功能强大
import typer

app = typer.Typer()

@app.command()
def uppercase(
    text: str = typer.Argument(..., help="要转换的输入文本"),
    repeat: int = typer.Option(1, "--repeat", "-r", help="重复输出次数"),
    silent: bool = typer.Option(False, "--silent", "-s", help="静默模式,不显示输出")
):
    """将输入文本转换为大写。"""
    result = text.upper()
    if not silent:
        for _ in range(repeat):
            typer.echo(result)

@app.command()
def lowercase(text: str):
    """将输入文本转换为小写。

    Args:
        text: 要转换的文本字符串
    """
    typer.echo(text.lower())

if __name__ == "__main__":
    app()
$ python test.py --help

 Usage: test.py [OPTIONS] COMMAND [ARGS]...                                                                                                                                                      

╭─ Options ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --install-completion          Install completion for the current shell.                                                                                                                       │
│ --show-completion             Show completion for the current shell, to copy it or customize the installation.                                                                                │
│ --help                        Show this message and exit.                                                                                                                                     │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ uppercase   将输入文本转换为大写。                                                                                                                                                            │
│ lowercase   将输入文本转换为小写。                                                                                                                                                            │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯