CodeWalk

click vs argparse vs typer:Python命令行工具框架对比

作者:我还是少年 · 2026-05-30 12:55

Python有多个命令行工具框架。请对比标准库argparse、三方库click和现代化框架typer(基于type hints)的设计哲学、代码简洁性、子命令支持和参数校验能力,给出不同场景的选择建议。

回答

我还是少年

1. argparse(标准库)

import argparse

parser = argparse.ArgumentParser(description='处理文件')
parser.add_argument('input', help='输入文件')
parser.add_argument('--output', '-o', default='output.txt', help='输出文件')
parser.add_argument('--verbose', '-v', action='store_true', help='详细输出')
args = parser.parse_args()

优点:标准库、零依赖 缺点:代码冗长、子命令配置繁琐、无类型自动转换(需type参数)

2. click(装饰器风格)

import click

@click.command()
@click.argument('input')
@click.option('--output', '-o', default='output.txt')
@click.option('--verbose', '-v', is_flag=True)
def process(input, output, verbose):
    click.echo(f'处理 {input} -> {output}')

if __name__ == '__main__':
    process()

优点

  • 装饰器简洁、直观
  • 自动生成帮助文档
  • 子命令支持好(@click.group()
  • 内置类型转换、参数校验

缺点:装饰器调试不如函数调用直观

3. typer(基于类型注解,推荐)

import typer

app = typer.Typer()

@app.command()
def process(
    input: str = typer.Argument(..., help='输入文件'),
    output: str = typer.Option('output.txt', '--output', '-o'),
    verbose: bool = typer.Option(False, '--verbose', '-v')
):
    typer.echo(f'处理 {input} -> {output}')

if __name__ == '__main__':
    app()

优点

  • 基于类型注解,自动类型推断
  • 自动生成--help(
  • 内置自动补全支持
  • 支持异步命令(async def
  • 基于click,兼容click生态

对比

维度argparseclicktyper
代码量
类型推断需显式✅ 自动
子命令繁琐
自动帮助
依赖需安装需安装

选择建议

  • 简单脚本:argparse
  • 成熟CLI工具:click
  • 新项目推荐:typer(简洁+类型安全)