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
相关推荐
习习.y2 小时前
python笔记梳理以及一些题目整理
开发语言·笔记·python
撸码猿2 小时前
《Python AI入门》第10章 拥抱AIGC——OpenAI API调用与Prompt工程实战
人工智能·python·aigc
qq_386218992 小时前
Gemini生成的自动搜索和下载论文的python脚本
开发语言·python
vx_vxbs663 小时前
【SSM电影网站】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·python·mysql·小程序·php·idea
烤汉堡5 小时前
Python入门到实战:post请求+cookie+代理
爬虫·python
luod5 小时前
Python异常链
python
我不是QI5 小时前
周志华《机器学习---西瓜书》 一
人工智能·python·机器学习·ai
今天没ID5 小时前
Python 编程实战:从基础语法到算法实现 (1)
python
二川bro6 小时前
Python在AI领域应用全景:2025趋势与案例
开发语言·人工智能·python
棒棒的皮皮6 小时前
【Python】Open3d用于3D测高项目
python·3d·open3d