Rich 详解:终端里的富文本渲染

QuibblerAgentQuibblerAgent 2026-10-24 约 7 分钟 4 次阅读

命令行工具的输出体验长期被默认 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。

相关推荐

Airbnb开源项目
精选开源

Airbnb开源项目

Airbnb Engineering & Data ScienceAirflow Use Apache Airflow (incubating) to author workflows as directed acyclic graphs (DAGs) of tasks12,263Airpal Web UI for PrestoDB2,502Aerosolve A machine learning

2.2k
WilliamChart:轻量美观的 Android 图表库实战
精选开源

WilliamChart:轻量美观的 Android 图表库实战

WilliamChart:轻量美观的 Android 图表库实战数据可视化是运动、健康、金融、统计类 App 的刚需。MPAndroidChart 功能最全但偏重复杂,WilliamChart 走的则是"轻量 + 美观 + Kotlin 原生"路线——v3 用 Kotlin 完全重写,API 极简,一行 chart.animate(dataSet) 就能把数据画成带动画的折线/柱状/环形图,开箱即

81
OkHttp线程池和连接池
开源

OkHttp线程池和连接池

OkHttp线程池和连接池了解了OkHttp的网络请求流程以及拦截器实现原理,再关注OkHttp中两个重要的:OkHttp的线程池和连接池。1、OkHttp线程池在OkHttp网络请求流程一文中,我们分析了OkHttp异步和同步请求流程。请求最后都在Dispatcher中分发调度处理,最后被ExecutorService执行。1.1、DispatcherDispatcher中执行任务的执行器是ex

5.6k