2025 python CLI 命令行框架比较

在 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 等知名项目采用。

示例

python 复制代码
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 写一个普通函数

python 复制代码
def main(name: str):
    print(f"Hello {name}")
  1. 直接运行!
python 复制代码
// 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'.                          │
╰───────────────────────────────────────────────────╯
python 复制代码
// 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.       │
╰───────────────────────────────────────────────────╯
python 复制代码
// Now pass the NAME argument
$ typer main.py run Camila

Hello Camila

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

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

比如:

python 复制代码
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 会变成什么:

sh 复制代码
$ 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 丰富。

示例

python 复制代码
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 支持较弱。

示例

python 复制代码
import fire

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

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

运行:

bash 复制代码
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 解析逻辑。
  • 代码量极少:但学习曲线较陡。

示例

python 复制代码
"""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 项目
argparse Python 内置,轻量级 简单脚本或兼容性需求
fire 自动转换函数为 CLI 快速原型开发
rich-cli 终端美化输出 数据展示工具
docopt 文档驱动设计 团队协作项目

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

框架 GitHub Stars (流行度) Forks (开发活跃度) Used By (使用广泛度)
click 16.5k 1.5k 2.2M 项目
typer 17.2k 736 208k 项目
fire 27.7k 1.5k 48.1k 项目
docopt 8k 564 140k 项目

推荐选择

  1. 新手入门 :从 clicktyper 开始。
  2. 需要类型提示 :优先 typer
  3. 极简需求 :用 argparsefire
  4. 终端美化 :结合 rich + click/typer
相关推荐
黄忠19 小时前
01-系统架构设计-LangGraph状态机与多源异构RAG
python
zzzzzz31020 小时前
假如我是掘金管理员,我先给评论区装个'代码审查'系统
python·程序员·机器人
砍材农夫20 小时前
python环境|conda安装和使用(2)
后端·python
程序员龙叔1 天前
编写高质量 Skill 系列 -- 如何设计需求分析与用例生成的 SKILL
自动化测试·软件测试·python·软件测试工程师·接口测试·性能测试·skill·ai测试
用户8356290780511 天前
使用 Python 操作 Word 内容控件
后端·python
码云骑士2 天前
32-慢查询排查全流程(下)-索引优化实战与最左前缀原则
python
闵孚龙2 天前
《PyTorch 深度修炼》Dataset 和 DataLoader:数据如何喂给模型
人工智能·pytorch·python
goldenrolan2 天前
A公司物料替代测试系统 v1.7:从需求到 exe/apk 的 AI 辅助全链路实践
android·自动化测试·软件测试·python·ai
菜板春2 天前
jupyter入门-手册-特征探索
python·jupyter