Python Rich 終端機美化與日誌

在開發命令行介面 (CLI) 工具或後端腳本時,傳統的純文字輸出往往顯得單調且難以閱讀,尤其在面對複雜資料或錯誤日誌時。Rich 是一個強大的 Python 函式庫,它能讓你輕易地在終端機中印出豐富的色彩、漂亮的表格、進度條、甚至是語法高亮,大幅提升工具的專業感與開發體驗。

安裝

pip install rich

核心組件:Console 與 Rich Printing

Console 物件是所有 Rich 功能的核心進入點。

from rich.console import Console

console = Console()

# 1. 直接列印並使用標記語言 (Markup)
# 支援顏色、粗體、斜體等
console.print("Hello [bold magenta]World[/bold magenta]!", ":vampire:")

# 2. 自動處理資料結構
# Rich 會自動幫 dict, list 上色並進行縮排,比 pprint 更好看
user_profile = {
    "id": 1024,
    "name": "Mike Lee",
    "tags": ["Python", "Developer", "Gamer"],
    "active": True
}
console.print(user_profile)

強大的排版工具

1. 表格 (Table)

當你需要呈現結構化資料時,表格是絕對的首選。

from rich.table import Table

table = Table(title="專案部署狀態", show_header=True, header_style="bold magenta")

table.add_column("服務名稱", style="dim", width=12)
table.add_column("版本", justify="center")
table.add_column("狀態", justify="right")

table.add_row("Web Server", "v2.1.0", "[green]Online[/green]")
table.add_row("Database", "v14.5", "[green]Online[/green]")
table.add_row("Cache", "v6.2", "[red]Offline[/red]")

console.print(table)

2. 進度條與狀態指示器 (Progress & Status)

處理由於網路或運算導致的等待時間,進度條能顯著降低使用者的焦慮。

  • 快速進度條:使用 track() 包裝迭代器。
  • 動態狀態:使用 console.status() 顯示旋轉動畫。
import time
from rich.progress import track

# 適用於已知總量的迭代
for n in track(range(10), description="正在下載資源..."):
    time.sleep(0.3)

# 適用於未知時間或啟動過程
with console.status("[bold green]正在檢查伺服器健康狀況...") as status:
    # 模擬耗時任務
    time.sleep(3)
    console.log("檢查完成!")

3. 面板與樹狀結構 (Panel & Tree)

讓輸出的層次感更加分明。

from rich.panel import Panel
from rich.tree import Tree

# 面板包裹
console.print(Panel("這是系統的重要通知內容", title="[bold red]警告", subtitle="2026-01-04"))

# 樹狀目錄
tree = Tree("Root Project")
src = tree.add("src")
src.add("main.py")
src.add("utils.py")
tree.add("tests")
tree.add("README.md")

console.print(tree)

除錯與日誌 (Debug & Logging)

一鍵檢查物件:Inspect

dir() 強大百倍。它能顯示物件的型別、值、甚至文件字串。

from rich import inspect

# 檢查 response 物件
inspect(user_profile, methods=True)

整合標準日誌:RichHandler

這是我最推薦的功能之一。你可以將 Python 內建的 logging 輸出替換成 Rich 的彩色版本。

import logging
from rich.logging import RichHandler

FORMAT = "%(message)s"
logging.basicConfig(
    level="INFO",
    format=FORMAT,
    datefmt="[%X]",
    handlers=[RichHandler(rich_tracebacks=True)] # 自動追蹤報錯行數與內容
)

log = logging.getLogger("rich")
log.info("API 服務已啟動")
log.warning("請求速度過快,觸發速率限制")
try:
    1 / 0
except ZeroDivisionError:
    log.exception("捕捉到非預期異常") # Rich 會輸出彩色的 Traceback

在終端機渲染 Markdown (Markdown Rendering)

如果你寫了 README.md 想在 CLI 直接展示:

from rich.markdown import Markdown

with open("README.md") as readme:
    markdown = Markdown(readme.read())
    console.print(markdown)

總結

  • Rich 能將你的終端機從 1980 年代的單色風格帶入現代。
  • Console 是核心,Table 是看板,Progress 是體驗。
  • 透過 RichHandler 整合 Logging,能極大加快你開發時的除錯速度。

如果你在開發一個會給他人使用的套件或 CLI 工具,Rich 是那種能讓你的產品瞬間看起來「很貴」的秘密武器。