2025 python CLI 命令行框架比较

1,088 阅读4分钟

在 Python 中,有许多流行的 CLI(命令行界面)框架,它们可以帮助开发者快速构建功能强大、用户友好的命令行工具。以下是目前最受欢迎的几种框架及其特点:

本文比较时间 2025-6-12。

TLDR: 选择 typer 或 click。typer 的样式更加现代化,如果喜欢传统简洁风格建议 click。


1. click

GitHub: github.com/pallets/cli…

流行度16.5k stars | 1.5k forks | used by 2.2m github 项目

维护性:最近一次提交 昨天

特点

  • 简单易用:基于装饰器(@click.command()),API 设计直观。
  • 功能丰富
    • 支持参数解析(@click.option@click.argument)。
    • 自动生成帮助信息(--help)。
    • 支持子命令(@click.group)。
    • 彩色输出(结合 richcolorama)。
  • 广泛使用:被 FlaskpipDjango 等知名项目采用。

示例

import click

@click.command()
@click.option("--name", default="World", help="Name to greet.")
def hello(name):
    click.echo(f"Hello, {name}!")

if __name__ == "__main__":
    hello()

适用场景:快速构建标准 CLI 工具。

点评:最灵活的底层框架,但是仍然需要通过注解写很多代码,改变了我们的开发习惯,其实这一部分代码可以通过 docstr 以及函数类型自动生成,这样无需改变我们的开发习惯,甚至让我们的习惯变得更好,这个典型案例就是即将登场的 typer。


2. typer

GitHub: github.com/tiangolo/ty…

流行度17.2k stars 736 forks used by 208k github 项目

维护性:最近一次提交 10 小时前

特点

  • 基于 click,但更现代化:利用 Python 类型注解(Type Hints)简化代码。
  • 极简代码:自动从函数参数生成 CLI 选项。
  • 适合大型项目:支持嵌套子命令和复杂参数。
  • 直接运行脚本:甚至无需改动代码就可以将一个脚本转成 CLI。

广泛使用:被 fastapi 等知名项目采用。

示例

1 写一个普通函数

def main(name: str):
    print(f"Hello {name}")
  1. 直接运行!
// Run your application
$ typer main.py run

// You get a nice error, you are missing NAME
Usage: typer [PATH_OR_MODULE] run [OPTIONS] NAME
Try 'typer [PATH_OR_MODULE] run --help' for help.
╭─ Error ───────────────────────────────────────────╮
│ Missing argument 'NAME'.                          │
╰───────────────────────────────────────────────────╯
// You get a --help for free
$ typer main.py run --help

Usage: typer [PATH_OR_MODULE] run [OPTIONS] NAME

Run the provided Typer app.

╭─ Arguments ───────────────────────────────────────╮
│ *    name      TEXT  [default: None] [required]   |
╰───────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────╮
│ --help          Show this message and exit.       │
╰───────────────────────────────────────────────────╯

// Now pass the NAME argument
$ typer main.py run Camila

Hello Camila

适用场景:喜欢类型注解的开发者,或从 click 迁移。

点评:写起来非常舒服,而且默认样式非常美观!argparse 的 bool 用起来非常难受,需要理解 store_true/false,但是 typer 不仅代码量少,而且支持更多能力,比如函数定义了一个 bool 参数,则自动变成 bool 参数,且自动增加 no- 参数。

比如:

import typer

app = typer.Typer()


@app.command()
def goodbye(name: str, formal: bool = False):
    if formal:
        print(f"Goodbye Ms. {name}. Have a good day.")
    else:
        print(f"Bye {name}!")


if __name__ == "__main__":
    app()

我们看看这个 formal 会变成什么:

$ python main.py goodbye --help

 Usage: main.py goodbye [OPTIONS] NAME

╭─ Arguments ───────────────────────────────────────╮
│ *    name      TEXT  [default: None] [required]   │
╰───────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────╮
│ --formal    --no-formal      [default: no-formal] │
│ --help                       Show this message    │
│                              and exit.            │
╰───────────────────────────────────────────────────╯

Automatic --formal and --no-formal for the bool option 🎉


3. argparse(Python 标准库) 🙅‍♂️ 不建议使用

文档: Python 官方文档
特点

  • 无需安装:Python 内置,适合轻量级需求。
  • 功能基础
    • 支持位置参数、可选参数。
    • 自动生成帮助信息。
  • 缺点:代码较冗长,功能不如 click 丰富。

示例

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--name", default="World", help="Name to greet.")
args = parser.parse_args()

print(f"Hello, {args.name}!")

适用场景:简单脚本或兼容性要求高的环境。

点评:可以学习实战不推荐。


4. fire(Google 出品)

GitHub: github.com/google/pyth…

流行度27.7k stars 1.5k forks used by 48.1k github 项目

维护性:最近一次提交 2 周前

特点

  • 零代码 CLI:自动将函数/类转换为 CLI 工具。
  • 快速原型开发:无需手动定义参数解析。
  • 适合内部工具:但对复杂 CLI 支持较弱。

示例

import fire

def greet(name="World"):
    return f"Hello, {name}!"

if __name__ == "__main__":
    fire.Fire(greet)

运行:

python demo.py --name Alice

适用场景:快速暴露 Python 函数为 CLI。


5. docopt(基于文档生成 CLI) 🙅‍♂️ 不建议使用

GitHub: github.com/docopt/doco…
流行度8k stars 564 forks used by 140k github 项目

维护性:欠维护。最近一次提交 7 年前

特点

  • 声明式设计:通过编写帮助文档自动生成 CLI 解析逻辑。
  • 代码量极少:但学习曲线较陡。

示例

"""Usage:
  demo.py [--name=<name>]

Options:
  --name=<name>  Name to greet [default: World].
"""
from docopt import docopt

args = docopt(__doc__)
print(f"Hello, {args['--name']}!")

适用场景:喜欢用文档驱动开发的团队。

点评:想法很巧妙,但欠维护 🙅‍♂️ 不建议使用。


对比总结

框架特点适合场景
click功能丰富,生态强大标准 CLI 工具
typer基于类型注解,代码简洁现代 Python 项目
argparsePython 内置,轻量级简单脚本或兼容性需求
fire自动转换函数为 CLI快速原型开发
rich-cli终端美化输出数据展示工具
docopt文档驱动设计团队协作项目

📊 Python CLI 框架对比(基于 GitHub 数据)

框架GitHub Stars (流行度)Forks (开发活跃度)Used By (使用广泛度)
click16.5k1.5k2.2M 项目
typer17.2k736208k 项目
fire27.7k1.5k48.1k 项目
docopt8k564140k 项目

推荐选择

  1. 新手入门:从 clicktyper 开始。
  2. 需要类型提示:优先 typer
  3. 极简需求:用 argparsefire
  4. 终端美化:结合 rich + click/typer