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
相关推荐
NeoFii18 分钟前
Day 39: 图像数据与显存
python·深度学习·机器学习
飞翔的佩奇1 小时前
【完整源码+数据集+部署教程】武器目标检测系统源码和数据集:改进yolo11-AggregatedAtt
人工智能·python·yolo·目标检测·计算机视觉·数据集·yolo11
大志说编程1 小时前
LangChain框架入门14:深入解析向量存储组件VectorStore
python·langchain·ai编程
华科云商xiao徐1 小时前
Rust+Python双核爬虫:高并发采集与智能解析实战
数据库·python·rust
在钱塘江1 小时前
LangGraph构建Ai智能体-10-RAG示例
人工智能·python
杜子不疼.2 小时前
《Python学习之基础语法2:掌握程序流程控制的艺术》
开发语言·python·学习
noravinsc2 小时前
django 如何读取项目根目录下的文件内容
后端·python·django
世纪钟声2 小时前
使用Playwright抓取小红书数据和自动化测试京东
python
这里有鱼汤3 小时前
终于有人把AI用在炒股上了,而且还是开源的!实测太震撼了
后端·python
钢铁男儿3 小时前
Python 元类基础:从理解到应用的深度解析
java·windows·python