命令行工具的输出体验长期被默认 print 统治——白字黑底、无对齐、无色彩。Rich 专门解决这个问题:它是一个在终端里渲染富文本与美化格式的 Python 库,出自 Textualize 之手,GitHub 上约 51k Star,MIT 协议开源。本文先看它的能力清单与安装,再依次展开打印、控制台、进度条与表格等核心用法,最后聊进阶场景与性能注意事项。
1、项目概述
Rich 的定位一句话讲清:给终端加上颜色、排版与结构化渲染。它兼容 Linux、macOS、Windows 终端以及 Jupyter,要求 Python 3.8 及以上,安装零门槛。
python -m pip install rich
它的特性覆盖面远超一般人的想象, README 里列出的能力包括以下这些。
- 富文本打印与 REPL 自动美化
Console对象的 print / log / status 方法- 表格、进度条、树形结构、多列布局
- Markdown 渲染与基于 pygments 的语法高亮
- 更易读的 Traceback,异常堆栈直接着色
- 冒号语法插入 Emoji,如
:smiley:
顺带一提,Rich 是终端应用框架 Textual 的渲染底座,学会 Rich 等于半只脚踏进 TUI 开发。
2、富文本打印上手
最简单的入口是模块级 print,直接替换内建 print 即可看到效果。README 的第一段示例长这样。
from rich import print
print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())
方括号标记语法类似 BBCode,[bold magenta] 到 [/bold magenta] 之间的文字会加粗并染成品红;:vampire: 自动替换为对应 Emoji;末尾传入的 locals() 会被美化打印成带语法高亮的字典。一行代码,终端立刻从 1970 年穿越回来。
需要更精细控制时就用 Console 对象,它是 Rich 的核心抽象,宽度探测、主题、文件重定向都由它管理。
from rich.console import Console
console = Console()
console.print("Hello", "World!", style="bold red")
console.print 支持多个参数拼接与全局 style,也能混用标记语法。把 Console(file=open("log.txt", "w")) 重定向到文件时,ANSI 转义会被自动剥离,同一个输出函数同时服务终端与日志文件。
3、进度条与日志
跑批任务时最实用的是进度条。rich.progress.track 是零成本版本,循环套一层即可。
from rich.progress import track
for step in track(range(100)):
do_step(step)
track 自动显示百分比、已完成数与 ETA,无需任何配置。需要多任务并行进度、传输速率或自定义列时,升级到 Progress 类:用 add_task 注册多个任务,循环内调用 update(task_id, advance=1),多个进度条互不闪烁地同屏刷新——Rich 的刷新机制做了差量绘制,这是它比手写 \r 靠谱的地方。
日志方面 console.log() 在打印内容的同时附带时间戳与代码位置,高亮语法自动套用;接入标准库则用 RichHandler。
import logging
from rich.logging import RichHandler
logging.basicConfig(level="INFO", handlers=[RichHandler()])
配上 RichHandler 后,logging.info 的输出带色彩、对齐与异常高亮,第三方库经标准 logging 打的日志同样受益,这是给老项目最低成本的颜值升级。
4、表格与结构化渲染
结构化数据在终端里对齐是老大难,Table 解决得很优雅。
from rich.table import Table
table = Table(title=" Stars ")
table.add_column("Project")
table.add_column("Stars", justify="right")
table.add_row("rich", "51k")
table.add_row("textual", "30k")
console.print(table)
表格自动适配终端宽度,超宽列自动截断折叠,Unicode 边框精致耐看。同一族渲染对象还有 Tree(目录结构、依赖树)、Columns(多列卡片)、Syntax(带行号的代码高亮)、Markdown(直接渲染 md 文本)。它们都是 renderable,可以互相嵌套——表格单元格里塞进度条、Tree 节点挂 Table 都是合法操作,CLI 工具的输出表现力因此上不封顶。
调试场景还有个冷门好物 rich.inspect,README 给出的用法是对任意对象打一份带方法的报告,排查陌生对象时比反复 dir 高效得多。
5、进阶与注意事项
Live显示区让表格、日志在屏幕同一区域持续刷新,做监控面板常用rich.traceback.install()全局接管未捕获异常,堆栈带变量与高亮Console(record=True)配合export_html可把终端输出导出网页存档- 输出量极大时避免每行都
console.print,批量内容交给单次渲染
性能上要有分寸:Rich 的排版有成本,逐 token 打印十万行日志时它比裸 print 慢一个数量级。纪律是——给人看的信息走 Rich,给机器吞的海量日志走结构化输出,两条路不要混。
6、总结
Rich 把终端输出从纯文本升级为一种可编程的富媒体:颜色、表格、进度条、Markdown、Traceback 一应俱全,而且每个能力都有零配置的快速入口,从 print 到 Live 的学习曲线爬得毫无痛感。对于写 CLI 工具的开发者,建议第一步就用 Console 加 RichHandler 替换默认输出,收益立竿见影;对于做数据处理与长任务的工程师,建议把 track 与 Progress 变成标准动作,跑批过程可观测是调试效率的最大杠杆。项目地址:Textualize/rich,文档见 rich.readthedocs.io。


