اگر می خواهید خروجی خط فرمان شما جذاب، قابل فهم و قابل اعتماد باشد، کتابخانه Rich در پایتون یکی از بهترین انتخاب ها است. با این ابزار می توانید متن های رنگی، جدول های منظم، نوار پیشرفت، رندر Markdown و حتی ردیابی خطاها را به شکلی استاندارد و قابل حمل به ترمینال بیاورید. در این راهنما یاد می گیرید چگونه با چند خط کد یک تجربه حرفه ای برای کاربران برنامه های خط فرمان خود بسازید.

شروع سریع و نصب

Rich با پایتون 3 به خوبی کار می کند و نصب آن تنها با یک دستور انجام می شود. پس از نصب، شی Console نقطه ورود شما برای چاپ حرفه ای است. نمونه های زیر پایه های کار را نشان می دهند.

# نصب
pip install rich

# سلام دنیا با رنگ
from rich import print
print("[bold green]Hello, Rich![/bold green]")

# استفاده از Console
from rich.console import Console
console = Console()
console.print("متن عادی")
console.print("[cyan]متن آبی آسمانی[/cyan]")
console.log("این یک پیام لاگ است")

برای پروژه های چند سکویی، نیازی به پیکربندی خاص ندارید. Rich به صورت خودکار توانایی های ترمینال را تشخیص می دهد و خروجی را متناسب می کند. اگر قصد دارید مستقیما به کاربران تازه کار نشان دهید که این ابزار چه می کند، ذکر کنید که کتابخانه Rich در پایتون بدون نیاز به وابستگی های پیچیده آماده استفاده است.

رنگ ها، استایل ها و مارکاپ

سیستم رنگ و استایل در Rich مبتنی بر مارکاپ ساده ای است که خوانایی بالایی دارد. می توانید رنگ، ضخامت، پس زمینه و ترکیب های پیش فرض را تعیین کنید. استفاده از مارکاپ باعث می شود متن ها در لاگ ها و خروجی ها سریع تر اسکن شوند.

from rich import print

# رنگ و استایل
print("[bold red]خطا[/bold red]: فایل پیدا نشد")
print("[yellow on black]هشدار روی پس زمینه مشکی[/yellow on black]")
print("[underline blue]لینک قابل کلیک در برخی ترمینال ها[/underline blue]")

# قالب بندی با متغیرها
user = "Ali"
print(f"سلام [bold magenta]{user}[/bold magenta]! خوش آمدی.")

اگر دوست دارید کنترل دقیق تری داشته باشید، از Style و Text استفاده کنید تا بخش های متفاوت یک رشته را با استایل های جداگانه بسازید. این روش برای سناریوهایی مناسب است که محتوا به طور پویا تولید می شود.

from rich.console import Console
from rich.text import Text
from rich.style import Style

console = Console()
txt = Text("وضعیت: ")
txt.append("موفق", style=Style(color="green", bold=True))
console.print(txt)

ساخت جدول های خوانا

جدول ها راهی بی نقص برای نمایش داده های ساخت یافته در ترمینال هستند. Rich امکان تعیین تراز، حداقل و حداکثر عرض، سبک قاب و حتی رنگ بندی سطرها را فراهم می کند. نتیجه خواناتر از چاپ ساده با فاصله ها است.

from rich.console import Console
from rich.table import Table

console = Console()
table = Table(title="گزارش فروش")

table.add_column("محصول", style="cyan", no_wrap=True)
table.add_column("تعداد", justify="right")
table.add_column("درآمد", justify="right", style="green")

table.add_row("کتاب", "120", "24,000,000")
table.add_row("گجت", "45", "67,500,000")

console.print(table)

برای مجموعه داده های بزرگ، ترکیب جدول با ویژگی هایی مثل اندازه ستون خودکار و برش متن باعث می شود خروجی روی ترمینال های کوچک هم قابل استفاده بماند. می توانید برای ردیف های مهم از رنگ متفاوت استفاده کنید تا توجه کاربر جلب شود.

نوار پیشرفت و وظایف چندگانه

نوار پیشرفت حرفه ای به کاربر حس کنترل می دهد. Rich از چندین وظیفه همزمان پشتیبانی می کند و شاخص هایی مثل سرعت، زمان گذشته و زمان تخمینی را نمایش می دهد. ظاهر پیش فرض تمیز است و قابل سفارشی سازی می باشد.

from time import sleep
from rich.progress import Progress, SpinnerColumn, BarColumn, TimeRemainingColumn

with Progress(
    SpinnerColumn(),
    "[progress.description]{task.description}",
    BarColumn(),
    "[progress.percentage]{task.percentage:>3.0f}%",
    TimeRemainingColumn(),
) as progress:
    task1 = progress.add_task("دانلود فایل ها", total=100)
    task2 = progress.add_task("پردازش داده", total=200)

    while not progress.finished:
        progress.update(task1, advance=1)
        progress.update(task2, advance=2)
        sleep(0.05)

اگر از کتابخانه های غیر همزمان استفاده می کنید، نسخه AsyncProgress نیز موجود است. در پروژه های پردازش فایل یا دریافت شبکه ای، این قابلیت کیفیت تجربه کاربر را به طور چشمگیری افزایش می دهد.

خروجی زنده و به روز رسانی آنی

Live امکانی است که به شما اجازه می دهد یک بخش از ترمینال را با داده های متغیر به روز نگه دارید؛ مثلا یک داشبورد کوچک با آمار جاری. این کار بدون پاک کردن کل صفحه انجام می شود و چشم کاربر خسته نمی شود.

from time import sleep
from rich.live import Live
from rich.table import Table

def make_table(i):
    t = Table(title="وضعیت سرورها")
    t.add_column("سرور")
    t.add_column("تاخیر")
    t.add_row("api-1", f"{10 + i} ms")
    t.add_row("api-2", f"{14 + i} ms")
    return t

with Live(auto_refresh=False) as live:
    for i in range(10):
        live.update(make_table(i), refresh=True)
        sleep(0.5)

با Live می توانید چند ویجت مانند جدول، درخت و متن را ترکیب کنید. نکته مهم این است که به روز رسانی ها را با فاصله مناسب انجام دهید تا منابع سیستم بی جهت مصرف نشود.

نمایش ساختارها: درخت، پنل و Markdown

برای نمایش سلسله مراتب فایل ها یا وابستگی ها از Tree استفاده کنید. برای برجسته کردن یک بخش متن یا پیام راهنما، Panel انتخاب خوبی است. همچنین Rich می تواند Markdown را مستقیما رندر کند.

from rich.console import Console
from rich.tree import Tree
from rich.panel import Panel
from rich.markdown import Markdown

console = Console()

# درخت
tree = Tree("پروژه")
tree.add("src").add("main.py")
tree.add("tests").add("test_main.py")
console.print(tree)

# پنل
console.print(Panel("نکته: از فایل env برای تنظیمات استفاده کنید", title="راهنما"))

# Markdown
md = Markdown("# عنوان\n- مورد اول\n- مورد دوم")
console.print(md)

این عناصر باعث می شوند مستندات و خروجی کمک کننده شما مستقیما در ترمینال جلوه کند و نیاز به ابزارهای جانبی کاهش یابد.

تعیین ساختار لاگ و خطاها

Rich فرمت لاگ را با زمان، نام ماژول و استایل جدا می کند. همچنین traceback های رنگی خواندن خطا را سریع تر می کند. برای برنامه های تولیدی، این امکانات عیب یابی را ساده می کنند.

from rich.console import Console
from rich.traceback import install

install(show_locals=True)
console = Console()

try:
    1 / 0
except Exception:
    console.log("[red]یک خطای جدی رخ داد[/red]")
    raise

اگر از logging استاندارد استفاده می کنید، Handler مخصوص Rich موجود است تا لاگ ها با همان استایل نمایش داده شوند. این رویکرد بین محیط توسعه و اجرا یکدستی ایجاد می کند.

یکپارچه سازی با ابزارهای خط فرمان

Rich با argparse، Click و Typer به خوبی هماهنگ می شود. کافی است به جای print از console.print استفاده کنید و برای پیام های راهنما از Panel یا Markdown بهره ببرید. این کار ظاهر یکدست و حرفه ای به ابزارهای شما می دهد.

import argparse
from rich.console import Console
from rich.panel import Panel

console = Console()
parser = argparse.ArgumentParser(description="ابزار نمونه")
parser.add_argument("--name", required=True)
args = parser.parse_args()

console.print(Panel.fit(f"سلام {args.name}", title="خروجی"))

در پروژه هایی که به کاربر نهایی تحویل می دهید، هماهنگی تجربه خروجی اهمیت زیادی دارد. استفاده از کتابخانه Rich در پایتون در کنار این فریم ورک ها به سرعت شما را به این هدف می رساند.

گام به گام: تبدیل یک ابزار ساده به ترمینال حرفه ای

سناریو: ابزاری دارید که فایل ها را پردازش می کند. می خواهیم آن را از چاپ های ساده به خروجی حرفه ای ارتقا دهیم.

  1. نصب Rich و جایگزینی print با console.print برای کنترل رنگ و ساختار.
  2. افزودن Panel برای پیام های راهنما و هشدارها.
  3. نمایش پیشرفت پردازش با Progress و گزارش های مرحله ای با log.
  4. جدول بندی نتایج خروجی برای خوانایی بهتر.
  5. نصب traceback رنگی برای عیب یابی سریع در خطاها.
# 1) پایه
from rich.console import Console
console = Console()

# 2) پیام راهنما
from rich.panel import Panel
console.print(Panel("این ابزار فایل ها را پاکسازی می کند", title="راهنما"))

# 3) پیشرفت
from rich.progress import Progress
files = ["a.csv", "b.csv", "c.csv"]
results = []

with Progress() as progress:
    task = progress.add_task("پردازش", total=len(files))
    for f in files:
        # پردازش فرضی
        results.append((f, "ok", 123))
        progress.advance(task)

# 4) جدول نتایج
from rich.table import Table
table = Table(title="نتایج")
table.add_column("فایل")
table.add_column("وضعیت", style="green")
table.add_column("رکوردها", justify="right")
for f, st, n in results:
    table.add_row(f, st, str(n))
console.print(table)

نکات بهینه سازی و سازگاری

برای بهترین تجربه، این نکات عملی را در نظر بگیرید تا خروجی شما روی محیط های مختلف پایدار و روان باشد.

  • تکیه بر قابلیت تشخیص خودکار Rich برای رنگ ها کافی است؛ اما اگر لازم شد، گزینه force_terminal را بر اساس نیاز تنظیم کنید.
  • در محیط های CI یا لاگ فایل، از console = Console(record=True) برای ذخیره ساختار خروجی استفاده کنید.
  • برای ترمینال های کوچک، عرض ستون ها را محدود کنید و از no_wrap برای ستون های کلیدی بهره ببرید.
  • نرخ به روز رسانی Live و Progress را منطقی نگه دارید تا مصرف CPU بالا نرود.
  • در پیام های خطا جزئیات کاربردی و قابل اقدام ارائه دهید، نه فقط رنگ قرمز.

اشتباهات رایج و راه حل ها

برخی خطاها و سوء برداشت ها در استفاده روزمره دیده می شود. با این نکات می توانید سریع تر رفع مشکل کنید.

  • رندر نشدن رنگ ها: مطمئن شوید خروجی شما به فایل ریدایرکت نشده است. در صورت نیاز با Console(force_terminal=True) مجبور به رنگ کنید.
  • به هم ریختگی جدول در ترمینال قدیمی: عرض ستون را مشخص کنید و از justify مناسب استفاده کنید.
  • کندی نوار پیشرفت: فاصله به روز رسانی را افزایش دهید یا ستون های اضافی را حذف کنید.
  • مارکاپ ناخواسته در لاگ فایل: هنگام نوشتن به فایل، Rich را طوری پیکربندی کنید که کدهای رنگ را حذف کند.
  • حذف تصادفی خروجی های قبلی در Live: از auto_refresh=False استفاده کنید و به صورت دستی refresh کنید.

مقایسه کوتاه قابلیت ها و کاربرد عملی

جدول زیر نشان می دهد هر قابلیت در چه موقعیتی بیشترین اثر را دارد و چرا ارزش استفاده دارد.

قابلیت کاربرد عملی
Table ارائه گزارش های ساخت یافته مثل نتایج پردازش یا آمار
Progress نمایش وضعیت دانلود، تبدیل فایل یا پردازش طولانی
Live ساخت داشبورد سبک با شاخص های به روز
Traceback عیب یابی سریع با نمایش رنگی مسیر خطا و متغیرها
Markdown و Panel نمایش راهنما و مستندات کوتاه داخل ترمینال

جمع بندی

Rich ابزاری است که با حداقل تغییر در کد، کیفیت تجربه کاربر در ترمینال را به سطح حرفه ای می رساند. از متن های رنگی و جدول ها تا نوار پیشرفت و خروجی زنده، همه چیز با الگوی ثابت و سازگار ارائه می شود. با رعایت چند نکته ساده درباره نرخ به روز رسانی، عرض ستون ها و مدیریت لاگ، می توانید برنامه های خط فرمان خود را خواناتر، سریع تر و قابل اعتمادتر کنید و در عین حال کنترل کامل بر ظاهر و محتوا داشته باشید.