如果你还在用 print 把变量往终端里塞,然后盯着黑白文字找bug,这篇文章就是为你写的。Python 的 Rich 库,几乎不用改代码,直接替换 print,终端输出就能从黑白报纸变成彩色杂志。
写在前面
这篇文章面向有一定 Python 基础的开发者。你至少应该熟悉 Python 基础语法,知道怎么安装第三方库,平时会用 print 来查看变量值或调试程序。
需要准备的工具:Python 3.8 或以上版本,以及 uv 或 pip。
你是不是也这样?
调试代码的时候,你大概写过这样的东西:
print(f"user_data = {user_data}")print(f"status = {status}")
然后终端里滚出一堆黑白文字,字典套列表、列表套字典的时候,你眯着眼睛找层级,感觉自己不是在写代码,是在考古。
print 就像自行车的铃铛,能响,但也就只是能响。它不会告诉你现在几点、代码在哪一行、数据结构长什么样。当你处理复杂对象、长循环、或者多线程任务时,print 那点信息根本不够用。
Rich 就是来解决这个问题的。它是个 Python 库,专门负责把终端输出变得好看、好用、好读。上手成本很低,改一行 import 就能直接替换掉 print。
安装 Rich
如果你已经在用 uv(强烈推荐),就这么装:
或者用 pip:
装好之后,在终端里跑一下这条命令,看看效果:
or
如果看到一堆彩色文字、表格、进度条在终端里跳舞,说明装好了。
print 方法
直接替换使用
Rich 最爽的一点,是你不需要重新学习一套 API。把这一行加到代码开头:
然后继续像平时一样用 print 就行。不同的是,现在你可以直接给文字加颜色、加粗、斜体,甚至插 emoji:
from rich import printprint("[bold red]错误[/bold red]:连接超时")print("[green]✓[/green] 数据加载完成")print("[italic]正在处理...[/italic]")
语法很简单,方括号里写样式,斜杠前面结束。不用记一堆 ANSI 转义字符,也不用调终端配色。
漂亮打印数据结构
调试的时候最烦的是什么?不是逻辑错了,是你 print 出来的字典根本看不清层级。
Rich 自带 pretty print,数据结构会自动格式化、带颜色、自动换行对齐:
from rich import printdata = { "users": [ {"name": "Alice", "age": 30, "roles": ["admin", "editor"]}, {"name": "Bob", "age": 25, "roles": ["viewer"]}, ], "settings": {"theme": "dark", "notifications": True}}print(data)
输出会自动缩进、高亮键名和字符串,一眼就能看出嵌套关系。用过 pprint 的人应该能体会这差距。
如果你想让整个 REPL 或Jupter Notebook等交互脚本中开启这个效果,加这两行:
from rich import prettypretty.install()
如上图, 在没使用pretty.install()前, 第三行的 obj 输出是没有美化的, 在第四行后的 obj 输出就美化输出了
☝️如上图, 在终端执行 uv run python 进入python 交互界面, 执行pretty.install()后, data对象也是美化输出
console 方法
调试日志,带时间戳和行号
print 的另一个问题是,它不会告诉你这条输出是哪一行代码产生的,也不会带时间戳。项目大了以后,你根本不知道哪个 print 是哪次运行的。
Rich 的 Console 对象自带 log 方法,正好补上这个缺口:
from rich.console import Consoleconsole = Console()console.log("用户登录成功")console.log("[red]数据库连接失败[/red]")
输出会自动带上当前时间、文件名和行号,像下面这样:
[08:42:15] DEBUG main.py:12 用户登录成功[08:42:16] ERROR main.py:13 数据库连接失败
如果你把 log_locals=True 传进去,它还会把当前作用域里的所有局部变量打成一张表格。排查 bug 的时候,这个比手动写十个 print 都管用。
from rich.console import Consoleconsole = Console()def test_debug(): # 这些都是局部变量 username = "小明" age = 28 score = 95.5 is_pass = True hobbies = ["旅行", "带娃", "写作"] # 🔥 关键:加 log_locals=True console.log("运行到这里啦!下面是所有局部变量:", log_locals=False)test_debug()
☝️上边的代码执行后输出如下图👇 
用表格整理数据
很多时候你打印出来的不是单个变量,而是一组记录。比如爬虫抓了一堆数据,你想看看每条记录的状态。print 会把它们挤成一行,Rich 的 Table 能把它们排得整整齐齐:
from rich.console import Consolefrom rich.table import Tableconsole = Console()table = Table(title="爬虫任务状态")table.add_column("URL", style="cyan")table.add_column("状态", justify="center")table.add_column("耗时", justify="right")table.add_row("https://example.com", "[green]成功[/green]", "1.2s")table.add_row("https://bad-site.com", "[red]失败[/red]", "30.0s")console.print(table)
表格会自动对齐、自动调整列宽,终端变窄的时候还会自动换行。你甚至可以在单元格里再嵌套颜色标记、进度条或者其他 Rich 对象。
进度条,让长循环不再盲目
处理大量文件、批量请求 API、训练模型的时候,你大概写过这种代码:
for i, item in enumerate(items): print(f"处理第 {i}/{len(items)} 个...") process(item)
终端里刷屏一样滚过去几百行,最后自己都看不清进度。Rich 的 track 函数一行代码搞定:
import timefrom rich.progress import trackitems = range(100)def process(item): # 模拟处理时间 time.sleep(0.1)for item in track(items, description="正在处理..."): process(item)
一个干净、不闪烁的进度条会出现在终端底部,显示百分比、剩余时间、处理速度。如果有多线程或者多任务,还能同时显示多个进度条,互不干扰。
语法高亮,读代码不再累
调试的时候经常需要把一段代码或者一段 JSON 打印出来看看。Rich 可以像 IDE 一样给它们上色:
from rich.console import Consolefrom rich.syntax import Syntaxconsole = Console()code = '''def hello(name): return f"Hello, {name}!"'''syntax = Syntax(code, "python", theme="monokai", line_numbers=True)console.print(syntax)
支持 Python、JSON、SQL、Markdown 等几十种语言。主题也可以换,比如 monokai、dracula、github 这些常见配色都有。
更优雅的错误提示
Python 默认的报错信息是白底红字一大坨,文件路径、代码行、错误类型全挤在一起,看着就头大。Rich 可以用更清晰的格式展示 traceback,带语法高亮,关键信息一眼就能抓到:
from rich.console import Consolefrom rich.traceback import installinstall(show_locals=True)console = Console()console.print(1 / 0)
☝️上图是使用rich.traceback, 👇下图是无rich.traceback
加上这一行,之后所有的未捕获异常都会用 Rich 的格式显示。不仅颜色分明,还会把出错位置的局部变量列出来,排查问题快很多。
常见问题提醒
最后说几个新手容易踩的坑:
⚠️ Rich 的 print 和内置 print 不完全一样:Rich 的 print 不支持 file= 和 flush= 参数。如果你需要往文件里写,用 Console(file=open("log.txt", "w")) 代替。
⚠️ Windows 老版本终端可能显示异常:Windows 的旧版命令提示符(cmd.exe)对颜色和 emoji 支持有限。如果你用 Windows,建议换成 Windows Terminal 或者 VS Code 的内置终端。
⚠️ Jupyter Notebook 里大部分功能可用:Rich 支持 Jupyter,但有些高级功能比如实时进度条的表现可能和在终端里略有不同。
⚠️ 别在日志文件里存颜色标记:如果你的日志需要保存到文件供后续分析,记得关掉颜色标记,或者单独输出纯文本版本。带颜色的文本在文件里会变成一堆 ANSI 转义符,很难阅读。
总结
Rich 不需要你花一整天去学。你原来怎么写 print,现在基本还能怎么写,输出却好看得多,信息也更全。
彩色调试、格式化数据结构、进度条、表格、语法高亮,这些功能把终端从一个只能出声的铃铛,变成了带屏幕的仪表盘。如果你每天还在和黑白终端打交道,花十分钟装上 Rich,感觉会很不一样。
你现在还在用 print 调试吗?评论区聊聊你平时怎么排查 bug。
预告: 下篇介绍 Rich 与 logging 类一起使用