Rich 终端渲染库入门实战指南:从 Rich Print 到表格、进度条与语法高亮
【免费下载链接】richRich is a Python library for rich text and beautiful formatting in the terminal.项目地址: https://gitcode.com/gh_mirrors/ri/rich
Rich 是 Python 生态中用于在终端输出富文本与精美排版的库,其官方法语 README(README.fr.md)系统介绍了它的安装、核心 API 与各类渲染组件。本指南以该文档为主体,结合仓库源码,带你从零掌握rich.print、Console、表格、进度条、Markdown、语法高亮、Traceback 等核心能力的用法与底层原理,读完即可在自己的 CLI 工具和脚本中落地使用。
兼容性与安装
支持的平台与前置条件
根据 README.fr.md,Rich 支持 Linux、macOS(OSX)和 Windows。True Color(真彩色)与 emoji 需要较新的终端支持(如新版 Windows Terminal),而经典终端会自动降级为 16 色显示。Rich 要求 Python 3.6.3 及以上版本,并且可以无需额外配置直接在 Jupyter Notebook 中工作——这一点在源码中也得到了印证:console.py 会检测is_jupyter环境,并自动从JUPYTER_COLUMNS、JUPYTER_LINES环境变量读取宽高,否则使用默认值。
安装与快速验证
使用 pip 或任意 PyPI 包管理器安装:
python -m pip install rich安装完成后,运行下面这条命令即可在终端看到 Rich 的能力演示(包含色彩、样式、表格、中日韩文本等):
python -m rich该命令的入口正是仓库中的 rich/main.py,它会构造一个展示多种特性的测试卡片(make_test_card()),包括 4-bit/8-bit/Truecolor 色阶、粗体/斜体/下划线等样式以及中文、日文、韩文文本支持。
Rich Print:一行代码接入富文本输出
最轻量的接入方式是把 rich.print 直接替换内置print。它的签名与 Python 内置print完全一致(同样支持sep、end、file、flush参数),因此可以无痛替换:
from rich import print print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())这段代码会输出加粗品红色(magenta)的 "World"、vampire emoji,并对locals()字典做美观的渲染。从源码看,rich/init.py 维护了一个全局Console单例(get_console()),模块级print实际委托给该单例的Console.print执行;若传入file参数,则会基于该文件流新建一个Console。
安装到 Python REPL
Rich 还能改造 Python REPL,让所有数据结构以美观、高亮的方式展示:
>>> from rich import pretty >>> pretty.install()之后在 REPL 中输入任意对象都会以缩进、着色后的形式呈现,非常适合交互式调试。
Console:掌控一切的输出入口
当需要更精细的控制时,应导入并实例化 Console 类:
from rich.console import Console console = Console()Console.print的接口刻意与内置print保持相似:
console.print("Hello", "World!")与内置print不同的是,Rich 会自动将文本按终端宽度换行排版,而不会横向溢出。
整行样式与细粒度标记
给整行输出设置样式,只需传入style关键字参数:
console.print("Hello", "World!", style="bold red")若要做行内细粒度样式,Rich 提供了一套语法类似 BBCode 的控制台标记(console markup):
console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].")其中[bold cyan]...[/bold cyan]表示加粗青色,[u]/[/u]表示下划线,[i]/[/i]表示斜体。所有标签必须成对闭合。
Console 构造参数与 print 参数速览
从 console.py 的构造函数可以整理出以下常用参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
color_system | "auto" | 可选"auto"、"standard"、"256"、"truecolor"、"windows",自动探测终端能力 |
force_terminal | None | 强制以终端模式输出(用于重定向场景) |
width/height | None | 显式指定输出尺寸,None时自动探测COLUMNS/LINES环境变量 |
stderr | False | 输出到标准错误流 |
soft_wrap | False | 启用软换行(不裁剪、按需换行) |
theme | None | 自定义主题(theme.py 中的Theme对象) |
markup/emoji/highlight | True | 分别控制标记解析、emoji 与自动语法高亮开关 |
tab_size | 8 | 制表符展开宽度 |
record | False | 记录输出,配合export_text()导出 |
log_time_format | "[%X]" | log()方法的时间戳格式 |
highlighter | ReprHighlighter() | 默认高亮器 |
Console.print本身还支持justify("left"/"center"/"right"/"full")、overflow("crop"/"fold"/"ellipsis")、no_wrap、width、height、crop等排版参数(见 console.py),用于精细控制文本布局。
Rich Inspect:一键审查任意对象
inspect 可以针对类、实例、内置函数等任意 Python 对象生成结构化审查报告:
>>> my_list = ["foo", "bar"] >>> from rich import inspect >>> inspect(my_list, methods=True)inspect支持丰富的关键字参数:methods=True展示可调用方法、help=True显示完整帮助文本、private=True显示单下划线私有属性、dunder=True显示双下划线魔术方法、all=True显示全部属性、title自定义标题等。其内部实现位于 _inspect.py,最终通过Console.print输出。
内置渲染组件(Renderables)
Rich 内置了大量"渲染组件",可直接组合出精美的 CLI 界面。以下组件都遵循统一的 Console Protocol(protocol.py),即通过实现__rich_console__方法被Console渲染,因此所有组件都可以互相嵌套(例如表格里放另一个表格、进度条里放文本)。
Log:带时间戳与调用位置的日志输出
Console.log()与print()接口类似,但额外渲染当前时间、调用文件和行号列。默认会对 Python 数据结构与 repr 字符串做语法高亮;当传入字典或列表等集合时,会将其排版到可用宽度内:
from rich.console import Console console = Console() test_data = [ {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, ] def test_log(): enabled = False context = { "foo": "bar", } movies = ["Deadpool", "Rise of the Skywalker"] console.log("Hello from", console, "!") console.log(test_data, log_locals=True) test_log()log_locals=True会额外渲染一个包含调用处局部变量的表格——从 console.py 源码可以看到,它会过滤掉__开头的变量,并用 scope.py 的render_scope生成局部变量面板。log()非常适合长时间运行的应用(如服务器)做终端日志,也是非常好的调试辅助工具。
日志模块(Logging)集成
Rich 还提供了内置的 loggingHandler(logging.py 的RichHandler),可对 Python 标准logging模块的输出做格式化与着色。使用时只需把RichHandler挂到 logger 上即可让日志输出获得 Rich 的排版效果。
Emoji
在输出文本中,用两个冒号包围 emoji 名称即可插入 emoji:
>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") 😃 🧛 💩 👍 🦝emoji 名称映射表位于 _emoji_codes.py,名称源自 Unicode 官方命名。
表格(Table)
Table 可以用 Unicode 字符渲染灵活的表头、边框、单元格对齐等。基础示例:
from rich.console import Console from rich.table import Table console = Console() table = Table(show_header=True, header_style="bold magenta") table.add_column("Date", style="dim", width=12) table.add_column("Title") table.add_column("Production Budget", justify="right") table.add_column("Box Office", justify="right") table.add_row( "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" ) table.add_row( "May 25, 2018", "[red]Solo[/red]: A Star Wars Story", "$275,000,000", "$393,151,347", ) table.add_row( "Dec 15, 2017", "Star Wars Ep. VIII: The Last Jedi", "$262,000,000", "[bold]$1,332,539,889[/bold]", ) console.print(table)注意要点:
- 单元格内同样支持 console markup,如
[red]Solo[/red]、[bold]...[/bold]; add_column支持style、width、justify("left"/"right"/"center")等参数;- 任何 Rich 可渲染的对象都能放进表头/单元格,包括另一张表格;
Table会根据终端可用宽度自动调整列宽,必要时换行或截断文本。仓库中的 examples/table_movie.py 演示了动态更新的表格动画。
进度条(Progress)
Rich 可以无闪烁地同时渲染多条进度条,用于跟踪长耗时任务。最基础的用法是配合track迭代任意序列(progress.py):
from rich.progress import track for step in track(range(100)): do_step(step)track会自动生成"描述文本 + BarColumn 进度条 + 百分比 + 剩余时间"的组合列。从源码看它还支持description、total、completed、transient(完成后清除)、refresh_per_second、disable等参数。
多进度条场景可以显式使用Progress对象并调用add_task/update/advance控制。内置列包括完成百分比、文件大小、文件速度、剩余时间等。仓库提供了可同时下载多个 URL 并实时显示进度的完整示例 examples/downloader.py,以及 examples/dynamic_progress.py、examples/file_progress.py 等。
状态动画(Status)
当难以估算进度时,可以用Console.status显示 spinner 动画(console.py),动画期间控制台仍可正常使用:
from time import sleep from rich.console import Console console = Console() tasks = [f"task {n}" for n in range(1, 11)] with console.status("[bold green]Working on tasks...") as status: while tasks: task = tasks.pop(0) sleep(1) console.log(f"{task} complete")status()方法支持spinner(动画名称,默认"dots")、spinner_style、speed(动画速度倍率)、refresh_per_second(刷新频率,默认 12.5)等参数。spinner 动画数据来自 _spinners.py。要查看全部可用 spinner 名称,运行:
python -m rich.spinner该命令会逐个演示所有 spinner 动画(其实现位于 rich/spinner.py)。
树形结构(Tree)
Tree 可以用引导线渲染文件结构等任何层次化数据,标签可以是纯文本或任意 Rich 可渲染对象。运行以下命令查看演示:
python -m rich.treeexamples/tree.py 提供了一个类似 Linuxtree命令的脚本,可递归展示任意目录结构。
多列布局(Columns)
Columns 可以把内容渲染成等宽或最优宽度多列。下面是一个极简的ls克隆(macOS/Linux),把目录列表按列输出:
import os import sys from rich import print from rich.columns import Columns directory = os.listdir(sys.argv[1]) print(Columns(directory))更完整的参考见 examples/columns.py,它把 API 拉取的数据按列展示。
Markdown 渲染
Markdown 可以把 Markdown 文本渲染到终端,尽力还原标题、列表、代码块、表格等格式:
from rich.console import Console from rich.markdown import Markdown console = Console() with open("README.md") as readme: markdown = Markdown(readme.read()) console.print(markdown)Markdown 的解析采用流式元素模型(源码中MarkdownElement及其子类TableElement、CodeBlock等见 markdown.py),底层用__rich_console__输出带样式的段落。
语法高亮(Syntax)
Rich 借助 pygments),用法与 Markdown 类似——构造Syntax对象后打印:
from rich.console import Console from rich.syntax import Syntax my_code = ''' def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: """Iterate and generate a tuple with a flag for first and last value.""" iter_values = iter(values) try: previous_value = next(iter_values) except StopIteration: return first = True for value in iter_values: yield first, False, previous_value first = False previous_value = value yield first, True, previous_value ''' syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) console = Console() console.print(syntax)Syntax构造时指定语言(如"python")、主题(如"monokai",默认"default")和是否显示行号(line_numbers=True)。主题数据定义在 rich/syntax.py 的SyntaxTheme与 _palettes.py 中。theme不仅支持内置主题,也支持从 pygments 自定义样式转换而来。
错误回溯(Traceback)
Rich 能把 Python 异常回溯渲染得比标准输出更易读,展示更多上下文代码。可以通过Console.print_exception()(console.py)捕获当前异常,也可以用rich.traceback.install()将 Rich 设置为默认异常处理器,让所有未捕获异常都走 Rich 渲染(traceback.py)。
延伸:Console Protocol 与自定义渲染
以上所有组件(表格、进度条、树、Markdown 等)都实现了Console Protocol(protocol.py):对象只需实现__rich_console__(self, console, options)并返回一组Segment,就能被Console.print/log渲染。这意味着你可以据此实现自己的富文本组件,与内置组件自由混排嵌套。控制台还会通过__rich_measure__参与宽度测量,实现表格/多列场景下的智能折行。
小结
本文围绕 README.fr.md 的核心内容,结合 rich/console.py、rich/table.py、rich/progress.py、rich/syntax.py 等源码与 examples 目录中的示例,完整覆盖了 Rich 的安装、rich.print、Console与 console markup、inspect、日志、emoji、表格、进度条、状态动画、树、多列、Markdown、语法高亮与 Traceback 等全部核心能力。下一步,你可以直接运行python -m pip install rich && python -m rich体验效果,再参照 examples 中的脚本,把 Rich 集成进你自己的 CLI 工具。
【免费下载链接】richRich is a Python library for rich text and beautiful formatting in the terminal.项目地址: https://gitcode.com/gh_mirrors/ri/rich
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考