tips:info
在上一节中,我们学习了如何使用 Rich 构建静态的界面组件(面板、表格、布局)。本节我们将深入探索 Rich 如何提升**调试体验**和**用户交互**能力。无论是让报错信息更易读,还是让用户输入更优雅,Rich 都能提供开箱即用的解决方案。
1. 捕获异常美化显示输出
Python 原生的 traceback(堆栈跟踪)信息通常是白底黑字或简单的红字,信息密集且难以快速定位问题。Rich 提供了 rich.traceback 模块,可以完全接管异常显示,提供语法高亮、局部变量显示以及更清晰的路径展示。
核心功能
- install():一键安装 Rich 异常处理器,替代默认
sys.excepthook。 - show_locals:显示出错位置的局部变量值,调试神器。
- theme:支持多种颜色主题。
代码示例
from rich.traceback import install
# 安装 Rich 异常处理器
# show_locals=True 会显示出错时的局部变量,调试时非常有用
install(show_locals=True)
def dangerous_function():
data = {"key": "value"}
# 故意触发 KeyError
return data["missing_key"]
# 运行后会看到美化的报错信息,而不是原生 traceback
dangerous_function()
默认异常显示:

开启异常显示但不显示局部变量:

开启异常显示且显示局部变量:

注意:一旦调用
install(),整个程序的未捕获异常都将通过 Rich 渲染。建议在开发环境开启,生产环境可根据日志配置决定。
2. 高亮输出显示
在 CLI 工具中展示代码片段或日志时,语法高亮能显著提升可读性。Rich 的 Syntax 类支持多种编程语言的语法高亮。
核心功能
- Syntax:包裹代码字符串,指定语言类型。
- line_numbers:显示行号。
- theme:指定高亮主题(如 "monokai", "github-dark" 等)。
代码示例
from rich.console import Console
from rich.syntax import Syntax
console = Console()
code = """
def hello():
print("Hello, World!")
return True
"""
# 创建语法高亮对象
syntax = Syntax(code, "python", theme="monokai", line_numbers=True)
console.print(syntax)
输出结果:

3. Markdown 格式输出
如果你习惯使用 Markdown 编写文档,Rich 可以直接在终端中渲染 Markdown 内容。这对于展示帮助信息(Help Message)或 README 摘要非常有用。
核心功能
- Markdown:解析 Markdown 字符串并渲染。
- 支持元素:标题、列表、代码块、引用、表格等。
代码示例
from rich.markdown import Markdown
markdown_text = """
# 项目说明
这是一个 **Rich** 示例项目。
## 功能列表
- [x] 异常美化
- [x] 语法高亮
- [ ] 待办事项
> 注意:请在 Python 3.6+ 环境下运行。
"""
console.print(Markdown(markdown_text))
输出结果:

4. 用户交互功能
原生的 input() 功能单一,无法隐藏密码或提供友好的提示样式。Rich 的 rich.prompt 模块提供了多种交互组件。
核心功能
- Prompt:带样式的文本输入。
- Confirm:yes/no 确认交互。
- IntPrompt/FloatPrompt:带类型验证的输入。
代码示例
from rich.prompt import Prompt, Confirm
# 普通输入
name = Prompt.ask("请输入你的名字", default="Guest")
# 密码输入(隐藏字符)
while(True):
password = Prompt.ask("请输入密码", password=True)
if len(password)>0:
break
# 确认交互
if Confirm.ask("是否继续操作?"):
console.print("[green]操作已确认[/]")
console.print(f"name={name}, password={password}")
else:
console.print("[red]操作已取消[/]")
# 多选一
choice = Prompt.ask("请输入你的英雄", default="妲己", choices=["妲己","张飞","李白"])
输出结果:

建议
- 调试优先:在开发阶段,强烈建议在入口文件顶部加上
install(show_locals=True),这能节省大量排查KeyError或AttributeError的时间。 - 帮助文档:利用
Markdown类来编写 CLI 工具的--help信息,比纯文本更美观且易于维护。 - 交互阻塞:
Prompt系列组件会阻塞程序等待用户输入。如果你需要生成静态文档(如save_svg),请确保跳过交互部分或使用default参数避免等待。 - 主题选择:
Syntax支持多种主题,可以通过print(list(SYNTAX_LEXERS))查看支持的语言,通过rich.style查看支持的主题。
后续更新内容 Rich 的实时更新(Live)与进度条高级用法,让命令行界面真正“动”起来。