Ketika kamu menjalankan script CLI yang kerjanya lama, output-nya biasanya cuma tumpukan teks putih polos yang susah dibedakan: mana info, mana peringatan, mana error. Rich, library Python buatan Will McGugan (orang yang sama di balik Textual), menangani ini dengan rapi. Kamu dapat warna, tabel, progress bar, syntax highlighting, sampai live display yang menulis ulang baris di tempat — tanpa menulis satu pun escape code ANSI manual. Tutorial ini memandu kamu dari nol sampai output terminal yang enak dibaca.

Instalasi

Rich ada di PyPI dan cuma butuh satu perintah. Tidak ada dependensi wajib di luar Python standar, jadi aman dipakai di server produksi sekalipun.

bash
pip install rich

Console dan markup warna

Titik masuk utama Rich adalah objek Console. Dari sana kamu mencetak teks dengan markup sederhana yang mirip BBCode: tandai teks pakai kurung siku untuk memberi warna, tebal, atau garis bawah. Tidak perlu mengingat kode seperti \033[1;31m.

python
from rich.console import Console
from rich import print

console = Console()

console.print("Hello, [bold magenta]World[/bold magenta]!")
console.print("[red]Error:[/red] koneksi gagal")
console.print("[bold underline]Judul penting[/bold underline]")
console.print("[green]OK[/green] 3 file berhasil diunduh")

Objek Console juga punya metode log() yang menambahkan timestamp dan memisahkan output visual dari teks biasa, berguna kalau kamu mencampur Rich dengan print() standar. Soal warna, Rich mendukung 256 warna dan truecolor, jadi skema warna terminal kamu dipakai penuh.

Tabel untuk data tabular

Laporan penggunaan disk, daftar user, hasil benchmark — semua lebih terbaca dalam bentuk tabel. Rich punya Table yang mengurus lebar kolom dan alignment secara otomatis.

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

console = Console()

table = Table(title="Penggunaan Disk per Partisi")
table.add_column("Partisi", style="cyan")
table.add_column("Ukuran", justify="right", style="magenta")
table.add_column("Terpakai", justify="right", style="yellow")
table.add_column("Sisa", justify="right", style="green")

table.add_row("/dev/sda1", "120 GB", "85 GB", "35 GB")
table.add_row("/dev/sda2", "500 GB", "210 GB", "290 GB")
table.add_row("/home", "200 GB", "140 GB", "60 GB")

console.print(table)

Progress bar untuk proses yang lama

Cara tercepat menampilkan progress bar adalah fungsi track(). Bungkus iterable biasa, dan Rich menampilkan bar plus perkiraan waktu selesai secara otomatis.

python
import time
from rich.progress import track

for i in track(range(100), description="Memproses file..."):
    time.sleep(0.02)

Kalau kamu perlu beberapa progress bar sekaligus atau kontrol lebih halus, pakai kelas Progress. Kamu menyusun kolom sendiri — deskripsi, bar, persentase, waktu berjalan — lalu memperbarui task secara manual. Untuk proses yang berjam-jam dan tidak boleh terikat satu terminal, jangan dipaksakan di progress bar: offload pekerjaannya ke Celery dan biarkan CLI hanya memantau status.

python
import time
from rich.progress import Progress, BarColumn, TextColumn, TimeElapsedColumn

with Progress(
    TextColumn("[progress.description]{task.description}"),
    BarColumn(),
    TextColumn("{task.percentage:>3.0f}%"),
    TimeElapsedColumn(),
) as progress:
    task = progress.add_task("[cyan]Mengunduh...", total=100)
    while not progress.finished:
        progress.update(task, advance=0.5)
        time.sleep(0.02)

Syntax highlighting

Rich bisa mewarnai kode dengan theme mirip editor. Berguna untuk CLI yang menampilkan snippet, atau menampilkan error dengan konteks kode yang lebih jelas.

python
from rich.console import Console
from rich.syntax import Syntax

code = """
def faktorial(n: int) -> int:
    # Hitung faktorial secara rekursif
    return 1 if n <= 1 else n * faktorial(n - 1)
"""

console = Console()
syntax = Syntax(code, "python", theme="monokai", line_numbers=True)
console.print(syntax)

Live display: update di tempat

Daripada menumpuk ratusan baris "memproses 1... memproses 2...", tampilkan status yang menimpa baris yang sama. Metode console.status() menampilkan spinner plus teks, lalu menghilang saat blok selesai.

python
import time
from rich.console import Console

console = Console()
with console.status("[bold green]Menjalankan migrasi database..."):
    time.sleep(2)
    # kerja berat di sini
console.print("[bold green]Selesai[/bold green]")

Integrasi dengan logging

Rich punya handler logging bernama RichHandler yang mengubah format logging bawaan jadi output berwarna, lengkap dengan traceback yang rapi. Kalau dasar logging Python masih asing buatmu, baca dulu Belajar Python Logging.

python
import logging
from rich.logging import RichHandler

logging.basicConfig(
    level=logging.INFO,
    format="%(message)s",
    datefmt="[%X]",
    handlers=[RichHandler(rich_tracebacks=True)]
)

log = logging.getLogger("rich")
log.info("Server mulai di port 8000")
log.warning("Cache hampir penuh")
log.error("Gagal koneksi ke database")

Kalau kamu sedang membangun CLI tool yang utuh, padukan Rich dengan Typer untuk menangani argumen dan subcommand. Saya sudah menulis panduannya di Membangun CLI Tools Modern dengan Python (Typer). Rich mengurus tampilan, Typer mengurus struktur command — kombinasi yang sering saya pakai untuk tool internal.

Rich dirancang untuk output yang dibaca manusia. Jangan pakai Rich untuk log yang di-stream ke file lalu diproses mesin, misalnya di-agregasi ke Prometheus atau Loki. Markup warnanya akan mencemari log terstruktur. Simpan Rich untuk terminal interaktif, JSON polos untuk pipeline.

Merapikan script lama

Cara termudah memulai: buka satu script CLI milikmu, ganti print() yang menandai status dengan console.print() berwarna, lalu tambahkan track() di loop yang paling lama. Dua perubahan kecil itu sudah mengubah kesan script dari sekadar jalan jadi terkelola. Setelah itu lanjut ke Table untuk output data dan status() untuk proses panjang.

Ambil script yang paling sering kamu jalankan, pasang Rich, lalu bandingkan output sebelum dan sesudah. Kalau sudah terasa manfaatnya, coba Live dari rich.live untuk dashboard real-time yang menggabungkan beberapa widget dalam satu tampilan.