200字
控制台富文本UI库Rich学习笔记(一)
2026-02-24
2026-02-27

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

2026-02-27T20:45:06-qkzkwhcm.png

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

2026-02-27T20:54:05-awaqmqfh.png

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可切换是否开启颜色
2026-02-27T11:35:53-axxbcsfg.png

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

输出结果

2026-02-27T11:40:20-nbqbssai.png

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 响应延迟[/]")

2026-02-27T12:06:28-subkqqpr.png

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

2026-02-27T14:49:31-zceebwai.png

如果需要同时在控制台和文件输出日志,可追加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

2026-02-27T15:14:25-btkyufst.png

5. 持久化输出

使用 console可以开启 record=True记录控制台输出报错为 htmlsvgtext格式

# 必须设置 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}")

控制台在不同环境下输出:

2026-02-27T19:46:10-eiuuvyie.png

控制台富文本UI库Rich学习笔记(一)
Author
Administrator
Published at
2026-02-24
License
CC BY-NC-SA 4.0

Comment