1. 什么是 Rich,为什么用它 #
默认的 print() 只能输出纯文本,调试复杂结构、展示表格或进度时很吃力。Rich 可以:
- 自动为字典、列表等数据结构添加颜色和缩进
- 渲染表格、进度条、Markdown、语法高亮代码
- 创建面板、树形结构、布局
- 无需更改代码即可全局替换
print - 支持控制台标记(类 BBCode)来精细控制样式
Rich 适用于日志美化、CLI 工具、数据展示、调试等场景。
2. 安装 #
pip install rich可选增强:
pip install "rich[jupyter]" # 支持 Jupyter Notebook3. 快速入门:美化 print #
最简单的用法是用 rich.print 替换内置 print,它能自动为各种 Python 对象添加颜色和格式:
from rich import print
print("Hello, [bold magenta]World[/bold magenta]!") # 支持控制台标记
print([1, 2, 3])
print({"name": "Alice", "age": 30, "skills": ["Python", "Rich"]})也可以全局替换:
from rich import print as rprint
# 或者完全接管内置 print
from rich import print输出效果:字典的键会高亮,字符串、数字有不同颜色,嵌套结构自动缩进。
4. 核心功能详解 #
4.1 Console 对象 #
Console 是 Rich 的核心,它提供了比 print 更多的控制:
from rich.console import Console
console = Console()
console.print("Hello", style="bold red")
console.log("这是一条日志") # 自动添加时间戳
console.print("[blue]链接: https://www.example.com[/blue]")4.2 控制台标记(Console Markup) #
使用类似 BBCode 的标签,可在字符串内嵌样式:
console.print("[bold italic]粗斜体[/] [red]红色[/] [on green]绿底[/]")
console.print("[link=https://example.com]点击访问[/link]") # 可点击链接(部分终端支持)[bold]、[italic]、[underline]、[strike] 等都可以叠加。颜色支持英文名、十六进制(#ff00ff)和 RGB(rgb(255,0,255))。
4.3 语法高亮与代码块 #
from rich.syntax import Syntax
code = """
def hello():
print("Hello, World!")
"""
syntax = Syntax(code, "python", theme="monokai", line_numbers=True)
console.print(syntax)4.4 Markdown 渲染 #
from rich.markdown import Markdown
md = """
# 标题
- 列表项 1
- **加粗文本**
"""
console.print(Markdown(md))4.5 表格 #
from rich.table import Table
table = Table(title="用户列表")
table.add_column("ID", style="cyan", justify="right")
table.add_column("Name", style="magenta")
table.add_column("Score", justify="right")
table.add_row("1", "Alice", "95")
table.add_row("2", "Bob", "87")
console.print(table)支持丰富的样式:边框类型(box= 参数)、标题位置、列对齐、行样式等。
4.6 进度条 #
from rich.progress import track
import time
for i in track(range(10), description="处理中..."):
time.sleep(0.5)更复杂的多进度条和自定义列:
from rich.progress import Progress
with Progress() as progress:
task1 = progress.add_task("[red]下载...", total=100)
task2 = progress.add_task("[green]处理...", total=50)
while not progress.finished:
progress.update(task1, advance=0.9)
progress.update(task2, advance=0.3)
time.sleep(0.1)4.7 树形结构 #
from rich.tree import Tree
tree = Tree("📁 项目根目录")
src = tree.add("📁 src")
src.add("📄 main.py")
tests = tree.add("📁 tests")
tests.add("📄 test_main.py")
console.print(tree)4.8 面板(Panel) #
from rich.panel import Panel
panel = Panel("重要提示内容", title="警告", border_style="red")
console.print(panel)4.9 列与布局 #
from rich.columns import Columns
from rich.panel import Panel
panels = [Panel(f"面板 {i}") for i in range(1, 5)]
console.print(Columns(panels))4.10 交互式提示与输入 #
from rich.prompt import Prompt, Confirm
name = Prompt.ask("请输入你的名字", default="匿名")
if Confirm.ask("确定继续吗?"):
console.print(f"[green]你好, {name}![/]")4.11 布局系统(Layout) #
可以创建分栏、分区的复杂布局(类似网页布局):
from rich.layout import Layout
layout = Layout()
layout.split(Layout(name="header", size=3), Layout(name="body"), Layout(name="footer", size=3))
layout["header"].update("头部内容")
layout["body"].split_row(Layout(name="left"), Layout(name="right"))
layout["left"].update("左侧栏")
layout["right"].update(Panel("右侧内容"))
console.print(layout)4.12 Live Display(动态刷新) #
可以在不反复滚屏的情况下动态更新内容,常用于实时状态面板:
from rich.live import Live
from rich.table import Table
import time
table = Table(title="实时状态")
table.add_column("时间")
table.add_column("状态")
with Live(table, refresh_per_second=4) as live:
for i in range(10):
table.add_row(time.strftime("%X"), f"事件 {i}")
live.update(table)
time.sleep(0.5)5. 记录日志(Logging Handler) #
Rich 可以替换标准库 logging 的 Handler,让日志带有颜色和列对齐:
import logging
from rich.logging import RichHandler
logging.basicConfig(
level=logging.INFO,
format="%(message)s",
handlers=[RichHandler()]
)
log = logging.getLogger("rich")
log.info("这是一条信息日志")
log.warning("警告信息")
log.error("错误信息", extra={"markup": True}) # 支持标记RichHandler 会显示时间、日志级别(带颜色)、消息,并自动用 rich.print 输出。
6. 与 Jupyter 配合 #
安装 rich[jupyter] 后,在 Notebook 中使用 console.print() 或直接返回 Rich 对象,可渲染 HTML 等价效果,语法高亮、表格、进度条都能正常显示。
7. 自定义主题与样式 #
Rich 内置了很多主题(Syntax 用的 pygments 主题)。也可以自定义 Console 的颜色系统:
from rich.console import Console
from rich.theme import Theme
custom_theme = Theme({
"info": "dim cyan",
"warning": "bold yellow",
"error": "bold red"
})
console = Console(theme=custom_theme)
console.print("信息", style="info")
console.print("警告", style="warning")8. 一些高级技巧 #
捕获输出并导出为 HTML / SVG:
from rich.console import Console console = Console(record=True) console.print("Hello World") html = console.export_html() # 导出 HTML 字符串 svg = console.export_svg() # 导出 SVG(需安装依赖)分页显示长输出:使用
console.pager()或with console.pager():上下文,自动通过系统分页器(如less)展示。转义序列去除:如需在日志文件中保存纯文本,可设置
Console(force_terminal=False)或使用capture方法。
9. 完整示例:一个简单的 CLI 仪表盘 #
from rich.console import Console
from rich.table import Table
from rich.progress import Progress
from rich.live import Live
import time
import random
console = Console()
def system_monitor():
table = Table(title="系统监控")
table.add_column("指标", style="cyan")
table.add_column("数值")
with Live(table, refresh_per_second=2) as live:
for _ in range(30):
table.rows = [] # 清空
table.add_row("CPU", f"{random.randint(10,90)}%")
table.add_row("Memory", f"{random.randint(30,80)}%")
table.add_row("Disk", f"{random.randint(20,60)}%")
live.update(table)
time.sleep(1)
system_monitor()10. 总结 #
| 功能 | 关键类/方法 |
|---|---|
| 美化打印 | rich.print, Console.print |
| 控制台标记 | [bold red]...[/] |
| 表格 | Table |
| 进度条 | track, Progress |
| 树形结构 | Tree |
| Markdown | Markdown |
| 代码高亮 | Syntax |
| 面板 | Panel |
| 布局 | Layout, Columns |
| 动态显示 | Live |
| 日志集成 | RichHandler |
| 导出 HTML/SVG | console.export_html() / export_svg() |
Rich 库几乎不需要大量配置就能将命令行程序的可读性和美观度提升一个档次,非常适合数据科学家、开发者、运维工具等需要与终端打交道的人。它的设计非常注重开发体验,API 直观,文档丰富,是 Python 终端应用的“颜值担当”。