英文readme • 简体中文 readme • 正體中文 readme • 西班牙语 readme • 德语 readme • 瑞典语 readme • 日语 readme • 韩语 readme • 法语 readme • 瑞士德语 readme • 印地语 readme • 巴西葡萄牙语 readme • 意大利语 readme • 俄语 readme • 印尼语 readme • 波斯语 readme • 土耳其语 readme • 波兰语 readme
Rich是一个Python库,用于在终端中呈现丰富的文本和美观的格式。
Rich API使得在终端输出中添加颜色和样式变得简单。Rich还可以渲染漂亮的表格、进度条、Markdown、语法高亮的源代码、回溯等——开箱即用。
如需Rich的视频介绍,请查看@fishnets88制作的calmcode.io。
看看人们对Rich的评价。
兼容性
Rich适用于Linux、macOS和Windows。真彩色/emoji在新版Windows Terminal上可用,经典终端限制为16种颜色。Rich需要Python 3.7或更高版本。
Rich无需额外配置即可与Jupyter notebooks配合使用。
安装
使用pip
或你喜欢的PyPI包管理器安装。
python -m pip install rich
运行以下命令在你的终端上测试Rich输出:
python -m rich
Rich打印
要轻松地为你的应用添加富文本输出,你可以导入rich print方法,它与Python内置的print函数具有相同的签名。试试这个:
from rich import print
print("你好,[bold magenta]世界[/bold magenta]!", ":vampire:", locals())
Rich REPL
Rich可以安装在Python REPL中,这样任何数据结构都将被美化打印和高亮显示。
>>> from rich import pretty
>>> pretty.install()
使用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.print("有[bold cyan]志者[/bold cyan],事[u]竟[/u][i]成[/i]。")
你可以使用Console对象轻松生成复杂的输出。详细信息请参阅Console API文档。
Rich检查
Rich有一个inspect函数,可以生成任何Python对象(如类、实例或内置对象)的报告。
>>> my_list = ["foo", "bar"]
>>> from rich import inspect
>>> inspect(my_list, methods=True)
详细信息请参阅inspect文档。
Rich库
Rich包含多个内置的_可渲染对象_,你可以用它们在CLI中创建优雅的输出,并帮助你调试代码。
点击以下标题查看详情:
日志
Console对象有一个log()
方法,其接口类似于print()
,但还会显示当前时间以及调用该方法的文件和行号。默认情况下,Rich会对Python结构和repr字符串进行语法高亮。如果你记录一个集合(如字典或列表),Rich会对其进行美化打印,使其适应可用空间。以下是一些这些功能的示例。
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 = ["死侍", "天行者崛起"]
console.log("来自", console, "的问候!")
console.log(test_data, log_locals=True)
test_log()
上面的代码产生以下输出:
注意log_locals
参数,它会输出一个包含调用log方法处局部变量的表格。
log方法可用于长时间运行的应用程序(如服务器)的终端日志记录,同时也是一个非常好的调试辅助工具。
日志处理器
你还可以使用内置的Handler类来格式化和着色Python日志模块的输出。以下是输出示例:
表情符号
要在控制台输出中插入表情符号,只需将表情符号名称放在两个冒号之间。这里有一个例子:
>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:")
😃 🧛 💩 👍 🦝
请谨慎使用此功能。
表格
Rich可以使用unicode字符渲染灵活的表格。它提供了大量的格式化选项,包括边框、样式、单元格对齐等。
上面的动画是使用examples目录中的table_movie.py生成的。
这里有一个更简单的表格示例:
from rich.console import Console
from rich.table import Table
console = Console()
table = Table(show_header=True, header_style="bold magenta")
table.add_column("日期", style="dim", width=12)
table.add_column("标题")
table.add_column("制作预算", justify="right")
table.add_column("票房", justify="right")
table.add_row(
"2019年12月20日", "星球大战:天行者崛起", "2.75亿美元", "3.75126118亿美元"
)
table.add_row(
"2018年5月25日",
"[red]索罗[/red]:星球大战外传",
"2.75亿美元",
"3.93151347亿美元",
)
table.add_row(
"2017年12月15日",
"星球大战8:最后的绝地武士",
"2.62亿美元",
"[bold]13.32539889亿美元[/bold]",
)
console.print(table)
这会产生以下输出:
请注意,控制台标记的渲染方式与print()
和log()
相同。事实上,任何Rich可渲染的内容都可以包含在表头/行中(甚至包括其他表格)。
Table
类足够智能,能够调整列的大小以适应终端的可用宽度,并根据需要换行文本。以下是同一示例,但终端比上面的表格更小:
进度条
Rich可以渲染多个无闪烁的进度条来跟踪长时间运行的任务。
对于基本用法,将任何序列包装在track
函数中并迭代结果。这里有一个例子:
from rich.progress import track
for step in track(range(100)):
do_step(step)
添加多个进度条也不难。这里有一个从文档中摘取的例子:
可以配置列以显示您想要的任何详细信息。内置列包括完成百分比、文件大小、文件速度和剩余时间。这里是另一个显示正在进行的下载的例子:
要自己尝试这个,请查看examples/downloader.py,它可以同时下载多个URL并显示进度。
状态
对于难以计算进度的情况,您可以使用status方法,它会显示一个"旋转器"动画和消息。这个动画不会阻止您正常使用控制台。这里有一个例子:
from time import sleep
from rich.console import Console
console = Console()
tasks = [f"任务 {n}" for n in range(1, 11)]
with console.status("[bold green]正在处理任务...") as status:
while tasks:
task = tasks.pop(0)
sleep(1)
console.log(f"{task} 完成")
这在终端中生成以下输出。
旋转器动画借鉴自cli-spinners。您可以通过指定spinner
参数来选择旋转器。运行以下命令查看可用的值:
python -m rich.spinner
上述命令在终端中生成以下输出:
树形结构
Rich可以渲染带有指引线的树形结构。树形结构非常适合显示文件结构或任何其他层次数据。
树的标签可以是简单的文本或Rich可以渲染的任何其他内容。运行以下命令进行演示:
python -m rich.tree
这生成以下输出:
查看tree.py示例,了解一个可以显示任何目录的树形视图的脚本,类似于Linux的tree
命令。
列
Rich可以以整齐的列形式渲染内容,列宽可以相等或最优化。这里有一个非常基本的(MacOS / Linux)ls
命令克隆,它以列的形式显示目录列表:
import os
import sys
from rich import print
from rich.columns import Columns
directory = os.listdir(sys.argv[1])
print(Columns(directory))
以下截图是columns示例的输出,它以列的形式显示从API获取的数据:
Markdown
Rich 可以渲染 [markdown](https://rich.readthedocs.io/en/latest/markdown.html),并能合理地将格式转换为终端显示。要渲染 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)
这将产生类似以下的输出:
语法高亮
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)
这将产生以下输出:
回溯
Rich 可以渲染美观的回溯,比标准 Python 回溯更易读且显示更多代码。你可以将 Rich 设置为默认的回溯处理程序,这样所有未捕获的异常都将由 Rich 渲染。
以下是在 OSX 上的显示效果(Linux 上类似):
所有 Rich 可渲染对象都使用控制台协议,你也可以使用它来实现自己的 Rich 内容。
Rich CLI
另请参阅 Rich CLI,这是一个由 Rich 驱动的命令行应用程序。直接从命令提示符语法高亮代码、渲染 markdown、以表格形式显示 CSV 等。
Textual
另请参阅 Rich 的姊妹项目 Textual,你可以用它在终端中构建复杂的用户界面。