Rich库是什么
Rich 是一个功能强大的 Python 库,专为在终端(Terminal)中呈现富文本(Rich Text)和精美布局而设计。
现代 Shell 终端基本都支持全彩和富文本展示,但原生实现繁琐且兼容性差。Rich 正是适配各种终端环境的一套高级抽象工具库。它不仅能自动检测终端能力(如是否支持颜色、窗口大小),还提供了大量开箱即用的高阶组件。
通过使用 Rich,开发者可以轻松实现以下能力,将 CLI 工具的体验提升到 GUI 级别:
- 富文本输出:无需记忆 ANSI 码,通过简单标记即可实现颜色、粗体、斜体、背景色。
- 复杂布局:轻松构建表格(Table)、面板(Panel)、分栏(Columns)、网格(Grid)。
- 内容渲染:直接渲染 Markdown 文档、JSON 数据、以及带有行号的代码语法高亮。
- 动态反馈:实现流畅的进度条(Progress)、加载动画(Spinner)和状态提示(Status)。
- 调试增强:自动美化异常堆栈追踪(Traceback),显示代码上下文和局部变量。
- 智能适配:自动检测当前环境(终端/管道/文件),智能降级输出(如在重定向时自动禁用颜色)。
初识Rich: 实现基本文本展示相关操作
先演示下老传统 Hello World!
from rich import print
# rich中自带print可打印富文本控制台字符输出,但仅为简化版本,console.print为完整版
print("[bold][red]Hello, [/][blue]World![/][/bold]")`
将会得到如下输出:
Hello, World!
[code]标记内容[/code]类似于<div>标签,有开和闭,包括的标记内容会被对应语义标签修改成对应样式,闭合标签可以简写[/],简写后自动贴合上一个形成一对
rich一般用于服务控制台应用,采用 console.print打印功能是最完整的。
字符标记功能如下:
from rich.console import Console
from rich.rule import Rule
# 创建控制台对象,开启记录(保存svg会用到),设置行宽度为120
console = Console(record=True, width=120)
# 分割线
print(Rule("style标记字符",style="blue"))
print("[bold]加粗[/bold]")
print("[italic]斜体[/italic]")
print("[underline]下划线[/underline]")
print("[strike]删除线[/strike]")
print("[blink]闪烁[/blink]")
print("[reverse]反色[/reverse]")
print("[dim]暗淡[/dim]")
print("[bold italic underline]组合样式[/bold italic underline]")

Style 对象
Style对象可用于提前声明样式,方便直接使用或灵活复用
from rich.style import Style
style = Style(color="red", bgcolor="yellow", bold=True, underline=True)
console.print("自定义样式", style=style)
对应效果就是上图的红字黄底
前景色 + 背景色
console.rule("前景色 + 背景色", style="blue")
# 基础颜色(16 色)
console.print("[red]红色[/red]")
console.print("[green]绿色[/green]")
console.print("[blue]蓝色[/blue]")
console.print("[yellow]黄色[/yellow]")
console.print("[on red]红底白字[/on red]")
console.print("[on blue]蓝底白字[/on blue]")
console.print("[black on yellow]黑字黄底[/black on yellow]")
# 256 色
console.print("[color(208)]256 色橙色[/color(208)]")
# RGB 颜色
console.print("[rgb(255,100,50)]RGB 自定义颜色[/rgb(255,100,50)]")
console.print("[on rgb(50,100,255)]RGB 背景色[/on rgb(50,100,255)]")

Console对象(常见功能)
一般来说 Console当作 print的替代品,但实际上,它提供了流控制、内容捕获、日志集成、环境感知等工程级能力。写好 CLI 工具,首先要驾驭好这台“印刷机”。注:Rich自带print支持的功能Console都能打印。
1. 输出环境配置
1.1 强制开启颜色 (CI/CD 场景)
# 强制开启颜色,即使是在管道中
console = Console(force_terminal=True)
console.print("[green]✓ CI/CD 流程正常[/]")
通过控制变量为 True Or False可切换是否开启颜色

1.2 固定宽度 (测试与布局)
为了让输出在不同屏幕上保持一致,或者为了测试布局效果,可以固定宽度。
# 强制宽度为 40 字符,测试换行效果
console = Console(width=40)
console.print("宽度40")
console.print("这是一段非常长的文本,用于测试固定宽度下的自动换行行为。", style="on blue")
# 强制宽度为 40 字符,测试换行效果
console = Console(width=80)
console.print("宽度80")
console.print("这是一段非常长的文本,用于测试固定宽度下的自动换行行为。", style="on green")
输出结果

1.3 静音模式 (Verbose 控制)
一些特殊场景可能需要屏蔽控制台输出,此时可使用--quiet模式
# 模拟 --quiet 模式
console = Console(quiet=True)
console.print("这条消息永远不会显示") # 被静默
console.quiet = False
console.print("这条消息可以显示") # 正常
2. 流控制
专业的 CLI 工具应该区分 正常输出 和 错误/日志输出。
stdout:给用户看的结果(如 AI 生成的代码)。
stderr:程序状态、错误、日志(如“正在连接..."、“报错信息”)。
这样用户可以使用 python main.py > output.log 只保存结果,而不混入日志。
console = Console()
# 正常结果输出到 stdout
console.print("🤖 AI 生成结果:\nprint('hello')")
# 错误/状态输出到 stderr
console.stderr = True
console.print("[red]⚠ 警告:API 响应延迟[/]")

3. 内容捕获
若无需在控制台打印输出,而是想拿到 Rich 渲染后的字符串(包含 ANSI 颜色码),用于发送网络请求、存入变量或单元测试,可使用内容捕获。
# 使用 capture 上下文管理器
with console.capture() as capture:
console.print("[bold]秘密信息[/]")
console.print("第二行")
# 获取渲染后的字符串(包含颜色控制码)
output = capture.get()
print(f"捕获内容:{repr(output)}")
输出:
捕获内容:'\x1b[1m秘密信息\x1b[0m\n第二行\n'
4. 日志集成
通过日志集成,可直接将日志同步用终端展示,不需要满篇写 console.print,而是可以让标准的 logging 模块自动拥有 Rich 的美化能。同时可以自动捕获异常位置,美化报错显示。
# 1. 创建 Console 实例
console = Console()
# 2. 配置 logging
logging.basicConfig(
level="INFO",
format="%(message)s", # Rich 会处理时间戳和级别样式
handlers=[RichHandler(console=console, rich_tracebacks=True)]
)
# 3. 正常使用 logging
logging.info("正在连接 AI 服务...")
logging.warning("Token 即将过期")
try:
1 / 0
except Exception:
logging.exception("发生未知错误") # 自动显示美观的 traceback

如果需要同时在控制台和文件输出日志,可追加FIleHandler
# 1. 创建当前模块的logger
logger = logging.getLogger("console_log") # 指定当前的logger属于console_log
logger.setLevel(logging.INFO)
logger.handlers.clear() # 清除 logging 原有handler
# 2. 创建配置 RichHandler 实例
console = Console()
console_handler = RichHandler(console=console, rich_tracebacks=True)
console_handler.setFormatter(
logging.Formatter(
"%(message)s",
datefmt="[%Y-%m-%d %H:%M:%S]"
)
)
# 3. 创建配置 FileHandler 实例
file_handler = logging.FileHandler(
"output.log",
mode="a",
encoding="utf-8"
)
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(
logging.Formatter(
"%(asctime)s %(levelname)-8s %(message)s",
datefmt="[%Y-%m-%d %H:%M:%S]"
)
)
# 4. 将配置好的handler加入logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 5. 正常使用 logging
logger.info("正在连接 AI 服务...")
logger.warning("Token 即将过期")
try:
1 / 0
except Exception:
logger.exception("发生未知错误") # 自动显示美观的 traceback

5. 持久化输出
使用 console可以开启 record=True记录控制台输出报错为 html、svg、text格式
# 必须设置 record=True 才能导出
console = Console(record=True)
console.print("[bold]会话开始[/]")
console.print("用户:帮我写个排序算法")
console.print("AI:好的,这是代码...")
# 导出为 HTML (可在浏览器查看)
console.save_html("session_log.html")
# 导出为 SVG (适合放在博客或文档中)
console.save_svg("session_log.svg")
# 导出为纯文本 (带 ANSI 码)
console.save_text("session_log.txt")
tips:danger
svg保存对中文不太友好,默认是每个字符无论中文还是英文都是1个位宽,<br/>所以中文会挤在一起,英文正常(用wps打开会正常,有必要可以用wps转png)
6. 自适应终端环境
感知当前运行环境,避免在不支持的地方输出复杂样式
console = Console()
# 1. 判断是否为真实终端
if console.is_terminal:
console.print("🎨 检测到终端,开启彩色模式")
else:
console.print("📄 检测到管道,输出纯文本")
# 2. 获取终端大小 (用于动态布局)
width, height = console.size
console.print(f"当前终端大小:{width}x{height}")
控制台在不同环境下输出:
