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
相关推荐
华研前沿标杆游学1 天前
华为松山湖高阶研学|企业数字化转型游学攻略
python
Data_Journal1 天前
用于网页抓取的 Node-unblocker
大数据·开发语言·数据库·python·scrapy
豆角焖肉1 天前
SSM 聚合项目搭建:多 Maven 模块项目
开发语言·python·pycharm
青 春 记 忆1 天前
零基础入门python20:Flask配置、扩展和蓝图拆分
python·flask·后端开发
m0_380743871 天前
为 OpenAI 兼容接口配置教程
开发语言·python·node.js
leisoo80971 天前
ig50数据落盘ClickHousevsTimescaleDBvsDuckDB实测对比 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
卷无止境1 天前
FastAPI 的 Metadata 到底是什么,又牵动了哪些核心概念
后端·python
卷无止境1 天前
FastAPI 调试实战,从断点到生产环境的排错心法
后端·python
yaoxin5211231 天前
503. Java 反射 - 编写 ServiceFactory 类
java·开发语言·python
kyrie_sakura1 天前
python学习笔记3 -- 流程控制语句结构
笔记·python·学习