rich 是一个 Python 库,作用是把终端输出做好看:表格、进度条、语法高亮、树状图、Markdown 渲染。它不提供界面,你自己的命令行程序 import 它之后,输出立刻从「一堆对齐歪掉的文字」变成有边框有颜色的版面。
它是库,不是应用
装完你不会得到一个 exe,只会多一个可以 import 的模块。用法是一行:
from rich.console import Console
c = Console()
c.print("[bold cyan]开始实测[/bold cyan]")
print 换成 c.print 之后,方括号里的标记会被解析成样式,中文字宽、颜色、换行都由它处理。这也是它最省事的地方:不用自己算中日韩字符占两个宽度的问题。
表格:列宽自动算
用标准库自己拼一个对齐的表格,最麻烦的是算出每列最宽的单元格再补空格,遇到中文还要乘 2。rich 的写法是声明列、填行,宽度它自己算:
t = Table(title="实测记录")
for h in ("项目", "版本", "耗时", "体积", "状态"):
t.add_column(h)
for i in range(6):
t.add_row(f"pkg-{i:03d}", f"1.{i%10}.0", f"{i*3}ms", f"{i*7}KB", "通过")
c.print(t)
输出带完整的 Unicode 边框,中英文混排也不会错位:
┌─────────┬───────┬──────┬──────┬──────┐
│ 项目 │ 版本 │ 耗时 │ 体积 │ 状态 │
├─────────┼───────┼──────┼──────┼──────┤
│ pkg-000 │ 1.0.0 │ 0ms │ 0KB │ 跳过 │
│ pkg-001 │ 1.1.0 │ 3ms │ 7KB │ 通过 │
└─────────┴───────┴──────┴──────┴──────┘
注意 项目 那一格补了 4 个空格,正好对上「pkg-000」的宽度。这件事如果不做,打印出来就是歪的。
语法高亮和树状图是附带的
高亮用 Syntax,传语言名和主题就行,支持 300 多种语言的主题配色。
from rich.syntax import Syntax
c.print(Syntax('def check(pkg):\n return pkg["size"] > 0\n', "python", line_numbers=True))
树状图用 Tree,加节点就自动画连接线,不需要自己算前缀。
实测库
├── 开发工具
│ ├── uv 0.13.5
│ └── httpie 3.2.4
└── 系统运维
├── uv 0.13.5
└── httpie 3.2.4
渲染 1000 行表格 266 毫秒
渲染开销是这类库必须看的指标。同一台机器,5 列,测三档:
| 行数 | 渲染耗时 | 输出字符数 | 每行成本 |
|---|---|---|---|
| 10 | 7.7 毫秒 | 580 | 0.77 毫秒 |
| 100 | 26.1 毫秒 | 4,300 | 0.26 毫秒 |
| 1000 | 265.8 毫秒 | 43,210 | 0.27 毫秒 |
基本是线性增长,每行 0.26 到 0.27 毫秒,没有出现某个数量级突然变慢的情况。1000 行 266 毫秒意味着交互式场景里不到 300 毫秒出结果,可以接受;但如果你的程序要实时刷新一个上千行的表,一秒刷新三次就会吃掉 800 毫秒,那时候该考虑分页或者只渲染变化的部分。
进度条是它的招牌
多任务并行进度条不用自己算刷新频率,Progress 对象里加 task,每轮更新一次完成量即可,它自己按终端宽度排版、自己控制刷新率、完成之后自动收尾。
from rich.progress import Progress
with Progress() as bar:
t = bar.add_task("下载", total=100)
for _ in range(100):
bar.advance(t)
它还有 Live 用来做局部刷新(比如仪表盘那种一直变的表格),以及 save_html 把整段输出导出成带样式的 HTML,方便贴到文档或网页里。本文的截图就是这么来的。
什么时候别用它
如果你只是打印几行日志,用它纯属增加依赖。它的 import 有成本,一个只跑一次的短脚本,为了三行彩色输出引入 7 个依赖不划算。
另外它对终端宽度敏感:输出重定向到文件时,宽度会退化到 80 列,表格可能被压成多行。要固定宽度得显式传 Console(width=120),否则管道里看到的效果和终端里不一致。
如果想要的是界面而不是终端排版,它不合适。同作者还做了 Textual,那是真正的终端 UI 框架,能做出可点击的窗口;rich 只负责把文字排好看。
没测的部分列一下,4 项:Live 局部刷新的 CPU 占用 / 300 种语言的语法高亮覆盖率 / Windows 旧版控制台的兜底表现 / 与 logging 模块的集成。








