控制台API

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

from rich.console import Console
console = Console()

然后,您可以从项目中的任何位置导入控制台,如下所示:

from my_project.console import console

Console对象处理为颜色和样式生成ANSI转义序列的机制。它将自动检测终端的功能,并在必要时转换颜色。

属性

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

  • size 是端子的当前尺寸(如果调整窗口大小,该尺寸可能会更改)。

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

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

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

颜色系统

有几种向终端写入颜色的“标准”,并不是所有的标准都被普遍支持。Rich将自动检测适当的配色系统,或者您可以通过为 color_system 发送到 Console 构造函数。

您可以设置 color_system 设置为下列值之一:

  • None 完全禁用颜色。

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

  • "standard" 可以显示8种颜色,有正常和明亮的变化,总共16种颜色。

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

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

  • "windows" 在传统的Windows终端上可以显示8种颜色。新的Windows终端可以显示“真彩色”。

警告

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

打印

要将丰富的内容写入终端,请使用 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的内置对象,如 TextTable ,以及 Syntax --或其他自定义对象。

日志记录

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

>>> 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"]')

你也可以 log 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 ───────────────────────────────

规则方法还接受 style 参数来设置线条的样式,并使用 align 参数对齐标题(“左”、“中”或“右”)。

状态

Rich可以用不会干扰常规控制台输出的“微调”动画显示状态消息。运行以下命令以演示此功能:

python -m rich.status

要显示状态消息,请调用 status() 以及状态消息(其可以是字符串、文本或其他可呈现的)。结果是一个上下文管理器,它启动和停止代码块周围的状态显示。以下是一个示例:

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

可以通过以下方式更改微调控件动画 spinner 参数::

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

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

python -m rich.spinner

对齐/对齐

打印和日志都支持 justify 参数,如果设置该参数,则必须是“Default”、“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),或者如果面板或表格单元格中的文本空间有限,则可能会发生溢出。

您可以指定Rich应该如何使用 overflow 参数为 print() 它应该是以下字符串之一:“折叠”、“裁剪”、“省略号”或“忽略”。缺省值为“Fold”,它会将任何多余的字符放在下一行上,根据需要创建尽可能多的新行来适应文本。

“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=False 当呼叫时 print()

控制台风格

该控制台有一个 style 属性,您可以使用该属性将样式应用于打印的所有内容。默认情况下 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 Word通过插入换行符来换行打印的文本。您可以通过设置来禁用此行为 soft_wrap=True 当呼叫时 print() 。使用 soft wrapping 启用了任何不适合的文本都会排到下面一行(S),就像内置的 print

修剪

这个 print() 方法具有布尔值 crop 争论。Crop的缺省值为True,这会告诉Rich裁剪任何原本会继续到下一行的内容。您通常不需要考虑裁剪,因为Rich会调整内容大小以适应可用宽度。

备注

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

输入

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

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

如果构建了Python readline 模块已预先加载,将提供详细的行编辑和历史记录功能。

正在导出

Console类可以将写入它的任何内容导出为文本、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() 要将内容直接写入磁盘,请执行以下操作。

有关富控制台生成的html输出的示例,请参见 标准颜色

导出SVG

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

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

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

_images/svg_export.svg

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

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代码字体。如果在页面中嵌入Rich SVG,则可能还需要添加指向 Fira Code CSS

错误控制台

控制台对象将写入 sys.stdout 默认情况下(这样您就可以在终端中看到输出)。如果您使用以下工具构建控制台 stderr=True 里奇会写信给 sys.stderr 。您可能希望使用它来创建一个 error console 因此,您可以从常规输出中拆分错误消息。以下是一个示例:

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 从控制台输出,而不是直接将其写入终端。您可以使用 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 来展示它。寻呼机通常是操作系统上的一个应用程序,它至少支持按下一个键来滚动,但通常会支持上下滚动文本和其他功能。

可以通过调用以下方法从控制台对输出进行分页 pager() 它返回一个上下文管理器。当寻呼机退出时,打印的所有内容都将发送到寻呼机。以下是一个示例:

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

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

由于大多数平台上的默认寻呼机不支持颜色,Rich将从输出中剥离颜色。如果您知道您的寻呼机支持颜色,则可以设置 styles=True 在调用 pager() 方法。

备注

里奇会看着 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以禁用动画。

备注

某些配置项系统支持ANSI颜色和样式,但不支持移动光标或选择性刷新终端部分的任何内容。对于这些,您可能需要设置 force_terminalTrueforce_interactiveFalse

环境变量

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

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

如果环境变量 FORCE_COLOR ,则将启用颜色/样式 TERM 。这在CI系统上很有用,CI系统不是终端,但仍然可以显示ANSI转义序列。

如果环境变量 NO_COLOR 设置后,Rich将禁用输出中的所有颜色。这一点优先于 FORCE_COLOR 。看见 no_color 了解更多细节。

备注

这个 NO_COLOR 环境变量删除 color 只有这样。保留模糊、粗体、斜体、下划线等样式。

如果 width / height arguments are not explicitly provided as arguments to Console then the environment variables COLUMNS/LINES 可用于设置控制台的宽度/高度。 JUPYTER_COLUMNS/JUPYTER_LINES 行为相似,在木星中也用到。