在 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
)。 - 彩色输出(结合
rich
或colorama
)。
- 支持参数解析(
- 广泛使用 :被
Flask
、pip
、Django
等知名项目采用。
示例:
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}")
- 直接运行!
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 项目 |
推荐选择
- 新手入门 :从
click
或typer
开始。 - 需要类型提示 :优先
typer
。 - 极简需求 :用
argparse
或fire
。 - 终端美化 :结合
rich
+click
/typer
。