控制台 API

为了完全控制终端格式,Rich 提供了一个 Console 类。大多数应用程序只需要一个 Console 实例,因此您可能希望在模块级别或作为顶级对象的属性创建一个。例如,您可以在项目中添加一个名为“console.py”的文件

from rich.console import Console
console = Console()

然后,您可以像这样从项目中的任何地方导入控制台

from my_project.console import console

控制台对象负责生成 ANSI 转义序列以进行颜色和样式处理。它会自动检测终端的功能,并在必要时转换颜色。

属性

控制台会自动检测渲染时所需的许多属性。

  • size 是终端的当前尺寸(如果调整窗口大小,可能会发生变化)。

  • encoding 是默认编码(通常为“utf-8”)。

  • is_terminal 是一个布尔值,指示 Console 实例是否正在写入终端。

  • color_system 是一个包含 Console 颜色系统的字符串(见下文)。

颜色系统

有多种向终端写入颜色的“标准”,并非所有标准都得到普遍支持。Rich 会自动检测适当的颜色系统,或者您也可以通过为 color_system 提供一个值到 Console 构造函数中手动设置它。

您可以将 color_system 设置为以下值之一

  • None 完全禁用颜色。

  • "auto" 将自动检测颜色系统。

  • "standard" 可以显示 8 种颜色,包括普通和亮度变化,总共 16 种颜色。

  • "256" 可以显示“standard”中的 16 种颜色以及固定调色板中的 240 种颜色。

  • "truecolor" 可以显示 1670 万种颜色,这很可能是您的显示器可以显示的所有颜色。

  • "windows" 可以显示旧版 Windows 终端中的 8 种颜色。新的 Windows 终端可以显示“truecolor”。

警告

设置颜色系统时要小心,如果设置的颜色系统高于终端支持的颜色系统,您的文本可能无法读取。

打印

要将富内容写入终端,请使用 print() 方法。Rich 会通过对象的 (__str__) 方法将任何对象转换为字符串,并执行一些简单的语法高亮显示。它还会对任何容器(如字典和列表)进行美观打印。如果打印字符串,它将呈现 控制台标记。以下是一些示例

console.print([1, 2, 3])
console.print("[blue underline]Looks like a link")
console.print(locals())
console.print("FOO", style="white on blue")

您还可以使用 print() 渲染支持 控制台协议 的对象,其中包括 Rich 的内置对象,如 TextTableSyntax — 或者其他自定义对象。

日志记录

log() 方法提供了与 print 相同的功能,但添加了一些对调试运行中的应用程序有用的功能。日志记录在左侧的列中写入当前时间,在右侧的列中写入调用该方法的文件和行号。以下是一个示例

>>> console.log("Hello, World!")
[16:32:08] Hello, World!                                         <stdin>:1

为了帮助调试,log() 方法有一个 log_locals 参数。如果您将其设置为 True,Rich 将显示调用该方法时局部变量的表格。

打印 JSON

print_json() 方法会美观打印(格式化和设置样式)包含 JSON 的字符串。以下是一个简短的示例

console.print_json('[false, true, null, "foo"]')

您还可以通过记录一个 JSON 对象来记录 json

from rich.json import JSON
console.log(JSON('["foo", "bar"]'))

由于打印 JSON 是一种常见的要求,您可以从主命名空间导入 print_json

from rich import print_json

您还可以通过以下命令行美观打印 JSON

python -m rich.json cats.json

低级输出

除了 print()log() 之外,Rich 还具有一个 out() 方法,该方法提供了一种更低级的写入终端的方式。out() 方法将所有位置参数转换为字符串,并且不会美观打印、换行或对输出应用标记,但可以应用基本样式,并且可以选择性地进行高亮显示。

以下是一个示例

>>> console.out("Locals", locals())

规则

rule() 方法会绘制一条水平线,并带有可选标题,这是将终端输出分成多个部分的好方法。

>>> console.rule("[bold red]Chapter 2")
─────────────────────────────── Chapter 2 ───────────────────────────────

rule 方法还接受 style 参数来设置线的样式,以及 align 参数来对齐标题(“left”、“center”或“right”)。

状态

Rich 可以使用“旋转器”动画显示状态消息,这不会干扰常规控制台输出。运行以下命令以演示此功能

python -m rich.status

要显示状态消息,请使用状态消息调用 status()(可以是字符串、Text 或其他可渲染对象)。结果是一个上下文管理器,它在代码块周围启动和停止状态显示。以下是一个示例

with console.status("Working..."):
    do_work()

您可以通过 spinner 参数更改旋转器动画

with console.status("Monkeying around...", spinner="monkey"):
    do_work()

运行以下命令以查看 spinner 的可用选项

python -m rich.spinner

对齐方式

print 和 log 都支持一个 justify 参数,如果设置,它必须是“default”、“left”、“right”、“center”或“full”之一。如果为“left”,则打印(或记录)的任何文本都将左对齐,如果为“right”,则文本将右对齐到终端,如果为“center”,则文本将居中对齐,如果为“full”,则文本将与终端的左右边缘对齐(就像书中的印刷文本一样)。

justify 的默认值为 "default",它通常看起来与 "left" 相同,但有一个细微的差别。左对齐将在文本的右侧用空格填充,而默认对齐则不会。只有当您使用 style 参数设置背景颜色时,您才会注意到这种区别。以下示例演示了这种区别

from rich.console import Console

console = Console(width=20)

style = "bold white on blue"
console.print("Rich", style=style)
console.print("Rich", style=style, justify="left")
console.print("Rich", style=style, justify="center")
console.print("Rich", style=style, justify="right")

这将生成以下输出

Rich
Rich                
        Rich        
                Rich

溢出

溢出是指打印的文本大于可用空间时发生的情况。如果打印的“单词”很长(例如 URL),或者如果面板或表格单元格中的文本空间有限,则可能会发生溢出。

您可以使用 overflow 参数在 print() 中指定 Rich 如何处理溢出,该参数应为以下字符串之一:“fold”、“crop”、“ellipsis”或“ignore”。默认值为“fold”,它将把任何多余的字符放在下一行,并根据需要创建新行以容纳文本。

“crop”方法将在行尾截断文本,丢弃任何会溢出的字符。

“ellipsis”方法类似于“crop”,但会在任何被截断的文本末尾插入省略号字符(“...”)。

以下代码演示了基本的溢出方法

from typing import List
from rich.console import Console, OverflowMethod

console = Console(width=14)
supercali = "supercalifragilisticexpialidocious"

overflow_methods: List[OverflowMethod] = ["fold", "crop", "ellipsis"]
for overflow in overflow_methods:
    console.rule(overflow)
    console.print(supercali, overflow=overflow, style="bold blue")
    console.print()

这将生成以下输出

──── fold ────
supercalifragi
listicexpialid
ocious

──── crop ────
supercalifragi

── ellipsis ──
supercalifrag…

您也可以将 overflow 设置为 “ignore”,这允许文本继续到下一行。在实践中,这看起来与 “crop” 相同,除非您还在调用 print() 时设置 crop=False

控制台样式

控制台有一个 style 属性,您可以使用它将样式应用于您打印的所有内容。默认情况下 style 为 None,这意味着没有应用额外的样式,但您可以将其设置为任何有效的样式。以下是一个设置了 style 属性的控制台示例

from rich.console import Console
blue_console = Console(style="white on blue")
blue_console.print("I'm blue. Da ba dee da ba di.")

软换行

Rich 通过插入换行符来对您打印的文本进行换行。您可以通过在调用 print() 时设置 soft_wrap=True 来禁用此行为。启用 *软换行* 后,任何不适合的文本都会像内置的 print 一样继续到下一行。

裁剪

print() 方法有一个布尔值 crop 参数。crop 的默认值为 True,它告诉 Rich 裁剪任何本来会继续到下一行的内容。您通常不需要考虑裁剪,因为 Rich 会调整内容大小以适合可用宽度。

注意

如果您使用 soft_wrap=True 打印,则裁剪会自动禁用。

输入

控制台类有一个 input() 方法,其工作方式与 Python 的内置 input() 函数相同,但可以使用 Rich 可以打印的任何内容作为提示。例如,这是一个带有表情符号的彩色提示

from rich.console import Console
console = Console()
console.input("What is [i]your[/i] [bold red]name[/]? :smiley: ")

如果 Python 的内置 readline 模块已加载,将可以使用复杂的行编辑和历史记录功能。

导出

控制台类可以将写入它的任何内容导出为文本、svg 或 html。要启用导出,首先在构造函数上设置 record=True。这告诉 Rich 保存您 print()log() 的任何数据的副本。以下是一个示例

from rich.console import Console
console = Console(record=True)

在写入内容后,您可以调用 export_text()export_svg()export_html() 以获取控制台输出作为字符串。您也可以调用 save_text()save_svg()save_html() 以将内容直接写入磁盘。

有关 Rich Console 生成的 html 输出的示例,请参阅 标准颜色

导出 SVG

使用 export_svg()save_svg() 时,SVG 的宽度将与您的终端窗口宽度(以字符为单位)匹配,而高度将自动缩放以适应控制台输出。

您可以在 Web 浏览器中打开 SVG。您也可以使用 <img> 标签将其插入网页,或将标记复制到您的 HTML 中。

下图显示了 Rich 导出的 SVG 示例。

_images/svg_export.svg

您可以通过从 rich.terminal_theme 模块导入所需主题并将其通过 theme 参数传递给 export_svg()save_svg() 来自定义 SVG 导出期间使用的主题

from rich.console import Console
from rich.terminal_theme import MONOKAI

console = Console(record=True)
console.save_svg("example.svg", theme=MONOKAI)

或者,您可以通过自己构造一个 rich.terminal_theme.TerminalTheme 实例并将其传递进来,来创建自己的主题。

注意

SVG 引用 Fira Code 字体。如果您在页面中嵌入 Rich SVG,您可能还希望添加指向 Fira Code CSS 的链接

错误控制台

控制台对象默认情况下会写入 sys.stdout(这样您就可以在终端中看到输出)。如果您使用 stderr=True 构造控制台,Rich 会写入 sys.stderr。您可能希望使用它来创建一个 *错误控制台*,以便您可以将错误消息与常规输出分开。以下是一个示例

from rich.console import Console
error_console = Console(stderr=True)

您可能还想在控制台上设置 style 参数,以使错误消息在视觉上更具区分性。以下是如何做到这一点

error_console = Console(stderr=True, style="bold red")

文件输出

您可以通过在构造函数上设置 file 参数来告诉控制台对象写入文件,该参数应该是一个以写入文本方式打开的文件类对象。您可以使用它将内容写入文件,而不会在终端上显示输出。以下是一个示例

import sys
from rich.console import Console
from datetime import datetime

with open("report.txt", "wt") as report_file:
    console = Console(file=report_file)
    console.rule(f"Report Generated {datetime.now().ctime()}")

请注意,当写入文件时,如果您不希望将输出换行到当前控制台宽度,您可能需要显式设置 width 参数。

捕获输出

在某些情况下,您可能希望 *捕获* 来自控制台的输出,而不是将其直接写入终端。您可以使用 capture() 方法来完成此操作,该方法返回一个上下文管理器。退出此上下文管理器后,调用 get() 以返回将写入终端的字符串。以下是一个示例

from rich.console import Console
console = Console()
with console.capture() as capture:
    console.print("[bold red]Hello[/] World")
str_output = capture.get()

捕获输出的另一种方法是将控制台文件设置为 io.StringIO。如果您在单元测试中测试控制台输出,建议使用此方法。以下是一个示例

from io import StringIO
from rich.console import Console
console = Console(file=StringIO())
console.print("[bold red]Hello[/] World")
str_output = console.file.getvalue()

分页

如果您有一些要呈现给用户的长输出,您可以使用 *分页器* 来显示它。分页器通常是您操作系统上的一个应用程序,它至少支持按一个键滚动,但通常支持在文本中向上和向下滚动以及其他功能。

您可以通过调用 pager() 来分页来自控制台的输出,该方法返回一个上下文管理器。当分页器退出时,打印的任何内容都将被发送到分页器。以下是一个示例

from rich.__main__ import make_test_card
from rich.console import Console

console = Console()
with console.pager():
    console.print(make_test_card())

由于大多数平台上的默认分页器不支持颜色,Rich 会从输出中删除颜色。如果您知道您的分页器支持颜色,您可以在调用 pager() 方法时设置 styles=True

注意

Rich 会查看 MANPAGER 然后查看 PAGER 环境变量(MANPAGER 优先级更高)以获取分页器命令。在 Linux 和 macOS 上,您可以将其中一个设置为 less -r 以启用带有 ANSI 样式的分页。

备用屏幕

警告

此功能目前处于实验阶段。您可能希望在生产环境中使用它之前等待。

终端支持一个“备用屏幕”模式,该模式与常规终端分开,并允许全屏应用程序,这些应用程序会保留您的输入流和命令。Rich 通过 set_alt_screen() 方法支持此模式,尽管建议您使用 screen(),它返回一个上下文管理器,在退出时禁用备用模式。

以下是一个备用屏幕的示例

from time import sleep
from rich.console import Console

console = Console()
with console.screen():
    console.print(locals())
    sleep(5)

上面的代码将在备用屏幕上显示一个漂亮的打印字典,然后在 5 秒后返回命令提示符。

您也可以向 screen() 提供一个可渲染对象,当您调用 update() 时,该对象将在备用屏幕上显示。

以下是一个示例

from time import sleep

from rich.console import Console
from rich.align import Align
from rich.text import Text
from rich.panel import Panel

console = Console()

with console.screen(style="bold white on red") as screen:
    for count in range(5, 0, -1):
        text = Align.center(
            Text.from_markup(f"[blink]Don't Panic![/blink]\n{count}", justify="center"),
            vertical="middle",
        )
        screen.update(Panel(text))
        sleep(1)

使用可渲染对象更新屏幕可以让 Rich 裁剪内容以适合屏幕,而无需滚动。

要使用 Rich 构建更强大的全屏界面,请参阅 实时显示

注意

如果您在退出 Python 代码后发现自己处于备用模式,请在终端中输入 reset

终端检测

如果 Rich 检测到它没有写入终端,它将从输出中剥离控制代码。如果您想将控制代码写入普通文件,请在构造函数中设置 force_terminal=True

让 Rich 自动检测终端很有用,因为它在您将输出管道到文件或其他应用程序时将写入纯文本。

交互模式

Rich 不会在不写入终端时删除动画(例如进度条和状态指示器),因为您可能不想将它们写入文本文件。您可以通过在构造函数中设置 force_interactive 参数来覆盖此行为。将其设置为 True 以启用动画,或将其设置为 False 以禁用动画。

注意

一些 CI 系统支持 ANSI 颜色和样式,但不支持移动光标或选择性刷新终端部分的任何操作。对于这些系统,您可能需要将 force_terminal 设置为 True,并将 force_interactive 设置为 False

环境变量

Rich 尊重一些标准环境变量。

将环境变量 TERM 设置为 "dumb""unknown" 将禁用颜色/样式以及一些需要移动光标的功能,例如进度条。

如果设置了环境变量 FORCE_COLOR,则无论 TERM 的值如何,都会启用颜色/样式。这在 CI 系统中很有用,这些系统不是终端,但仍然可以显示 ANSI 转义序列。

如果设置了环境变量 NO_COLOR,Rich 将禁用输出中的所有颜色。这优先于 FORCE_COLOR。有关详细信息,请参阅 no_color

注意

环境变量 NO_COLOR 仅删除颜色。样式(如淡色、粗体、斜体、下划线等)将保留。

如果未明确将 width / height 参数作为参数提供给 Console,则环境变量 COLUMNS/LINES 可用于设置控制台宽度/高度。 JUPYTER_COLUMNS/JUPYTER_LINES 的行为类似,并在 Jupyter 中使用。