Salida Enriquecida
Rich renderiza texto formateado, tablas, barras de progreso y resaltado de sintaxis en la terminal. Hace que la salida de la CLI sea legible sin sacrificar la capacidad de scripting.
Receta
uv add richfrom rich.console import Console
console = Console()
console.print("[bold green]¡Éxito![/bold green] Desplegado v1.2.3")Cuándo usar esto:
- Salida de CLI orientada a humanos (tablas, paneles de estado)
- Operaciones de larga duración que necesitan barras de progreso
- Visualización de configuración o registros con resaltado de sintaxis
Ejemplo Funcional
from rich.console import Console
from rich.table import Table
from rich.progress import track
from rich.syntax import Syntax
import time
console = Console()
def show_users(users: list[dict]):
table = Table(title="Usuarios Activos")
table.add_column("ID", style="cyan", justify="right")
table.add_column("Email")
table.add_column("Rol", style="magenta")
for u in users:
table.add_row(str(u["id"]), u["email"], u["role"])
console.print(table)
def process_files(paths: list[str]):
for path in track(paths, description="Procesando..."):
time.sleep(0.1) # simular trabajo
console.print("[green]¡Hecho![/green]")
def show_config(yaml_text: str):
syntax = Syntax(yaml_text, "yaml", theme="monokai", line_numbers=True)
console.print(syntax)Lo que esto demuestra:
- Tablas con columnas estilizadas para datos estructurados
track()envuelve iterables con una barra de progresoSyntaxresalta código y archivos de configuración- Marcado
[green]para estilo en línea
Inmersión Profunda
Modos de Salida
| Modo | Uso |
|---|---|
| Tabla Rich | Inspección humana |
| JSON a stdout | Análisis por máquina (flag --json) |
| stderr para registros | Mantener stdout canalizable |
Console(soft_wrap=True) | Terminales estrechas |
Errores Comunes
- Salida Rich en comandos canalizados - Códigos ANSI en archivos. Solución:
Console(force_terminal=False)o flag--plain. - Barra de progreso en stderr - predeterminado correcto. Solución: no redirigir el progreso a stdout.
- Tablas para consumo de scripts - rompe el análisis. Solución: flag
--jsonpara salida de máquina; Rich para modo humano predeterminado. - Registros mediante print - sin niveles ni marcas de tiempo. Solución:
rich.logging.RichHandlerpara registros estructurados. - Tablas enormes - desbordamiento de terminal. Solución: paginar o limitar filas con flag
--limit.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| print simple | Solo salida de script | Panel dirigido al usuario |
| tabulate | Tablas simples, sin colores | Se necesitan barras de progreso |
| tqdm | Solo progreso | Suite de formato completa |
Preguntas Frecuentes
¿Salida Rich o simple?
Rich para uso humano interactivo. Añadir --json o --plain para automatización.
¿Rich funciona en Windows?
Sí. Windows Terminal soporta colores ANSI. cmd heredado puede necesitar colorama.
¿Cómo registro con Rich?
logging.basicConfig(handler=RichHandler(), level=logging.INFO).
¿Puede Rich renderizar Markdown?
from rich.markdown import Markdown; console.print(Markdown(text)).
¿Cómo pruebo la salida de Rich?
Console(file=StringIO()) captura la salida para aserciones.
¿Paneles en vivo?
from rich.live import Live para pantallas actualizables.
¿Rich en Click/Typer?
Compatible. Usar click.echo para texto simple; Rich Console para salida compleja.
¿Cómo desactivo los colores?
Console(no_color=True) o variable de entorno NO_COLOR=1.
¿Vistas de árbol?
from rich.tree import Tree para visualización jerárquica.
¿Rendimiento en salida grande?
Transmitir o paginar. No construir tablas de un millón de filas.
Relacionado
- Conceptos Básicos de CLI - convenciones de stdout/stderr
- Click - integración de framework CLI
- Prompts Interactivos - entrada de usuario
- Mejores Prácticas de CLI - directrices de salida
Versiones de Stack: Esta página fue escrita para Python 3.14.0, FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.