Script CLI robusto en Python con tests
Escribe un script de línea de comandos en Python listo para producción: argparse, logging, gestión de errores, códigos de salida y tests con pytest. Pensado para ChatGPT, Claude y Microsoft Copilot. Incluye 6 variables personalizables y se copia gratis en un clic.
Intermedio · Código · Pendiente de revisión editorial
Prompt
Actúa como desarrollador Python senior que escribe herramientas internas mantenibles.
Necesito un script de línea de comandos llamado `{{nombre_script}}` que haga lo siguiente: {{tarea}}.
Entradas: {{entradas}}.
Salidas esperadas: {{salidas}}.
Versión de Python: {{version_python}}. Dependencias permitidas: {{dependencias}}.
Entrega, en este orden:
1. Diseño de la interfaz: subcomandos (si tienen sentido), argumentos posicionales, opciones con valores por defecto y un ejemplo de `--help`.
2. El código completo en un único archivo, con:
- `argparse`, `main(argv=None) -> int` y `if __name__ == "__main__"`.
- `logging` configurable con `--verbose` y `--quiet`, mensajes a stderr y resultados a stdout.
- Tipado completo, `pathlib` para rutas y funciones pequeñas y puras separadas de la E/S.
- Opción `--dry-run` si el script modifica archivos o sistemas externos.
- Códigos de salida documentados (0 éxito, 1 error de uso, 2 error de datos, etc.).
3. Gestión de errores: qué excepciones se capturan, mensajes claros para el usuario y sin trazas salvo en modo verbose.
4. Tests con `pytest` (incluido `tmp_path` y `capsys`) para el caso feliz, entradas inválidas y casos límite.
5. Instrucciones de uso y cómo empaquetarlo con `pyproject.toml` como comando instalable.
Restricciones:
- Sigue PEP 8 y no uses dependencias fuera de las permitidas.
- No supongas formatos de datos que no te haya descrito: pregúntame o usa [COMPLETAR].Cómo usarlo
- Explica la tarea con un ejemplo real de entrada y salida.
- Indica si puedes instalar dependencias o solo usar la biblioteca estándar.
- Guarda el script y los tests, y ejecuta
pytestantes de usarlo con datos reales. - Prueba siempre primero con
--dry-run.
Ejemplo de uso
Script: renombrar-facturas · Tarea: renombrar PDF de facturas con fecha y proveedor leídos de un CSV · Solo biblioteca estándar.
Resultado de ejemplo
2. Código (extracto de renombrar_facturas.py)
from __future__ import annotations
import argparse
import csv
import logging
import sys
from pathlib import Path
log = logging.getLogger("renombrar-facturas")
def nuevo_nombre(fecha: str, proveedor: str) -> str:
"""Función pura: '2025-03-14', 'Papelería Sol' -> '2025-03-14_papelería-sol.pdf'."""
return f"{fecha}_{'-'.join(proveedor.lower().split())}.pdf"
def leer_csv(ruta: Path) -> dict[str, str]:
with ruta.open(newline="", encoding="utf-8") as f:
return {fila["archivo"]: nuevo_nombre(fila["fecha"], fila["proveedor"]) for fila in csv.DictReader(f)}
def main(argv: list[str] | None = None) -> int:
p = argparse.ArgumentParser(prog="renombrar-facturas", description="Renombra facturas PDF según un CSV.")
p.add_argument("carpeta", type=Path)
p.add_argument("csv", type=Path)
p.add_argument("--dry-run", action="store_true", help="muestra los cambios sin aplicarlos")
nivel = p.add_mutually_exclusive_group()
nivel.add_argument("-v", "--verbose", action="store_true")
nivel.add_argument("-q", "--quiet", action="store_true")
args = p.parse_args(argv)
logging.basicConfig(level=logging.DEBUG if args.verbose else logging.ERROR if args.quiet else logging.INFO)
try:
cambios = leer_csv(args.csv)
except (OSError, KeyError) as e:
log.error("No se puede leer el CSV: %s", e)
return 2
for viejo, nuevo in cambios.items():
origen, destino = args.carpeta / viejo, args.carpeta / nuevo
if not origen.exists() or destino.exists():
log.warning("Omitido: %s", viejo)
continue
print(f"{viejo} -> {nuevo}")
if not args.dry_run:
origen.rename(destino)
return 0
if __name__ == "__main__":
sys.exit(main())
Códigos de salida: 0 éxito, 1 error de uso (lo gestiona argparse con 2 por defecto: [COMPLETAR] si quieres unificarlo), 2 error de datos. El formato de fecha del CSV no está descrito: [COMPLETAR]…
Datos clave
- Categoría
- Programación y desarrollo · Python
- Tipo de resultado
- Código
- Nivel
- Intermedio
- Pensado para
- ChatGPT, Claude y Microsoft Copilot
- Verificado en
- Pendiente de verificación editorial
- Variables
- Nombre del script, Tarea, Entradas, Salidas, Versión de Python y Dependencias permitidas
- Idioma
- Español
- Precio
- Gratis, sin registro
- Actualizado
- 07/11/2026
Preguntas frecuentes
¿Por qué argparse y no Click o Typer?
Argparse viene con Python y no añade dependencias, algo útil en servidores o equipos con restricciones. Si puedes instalar paquetes, indica Typer o Click en las dependencias permitidas y el prompt se adaptará.
¿Qué aporta separar la lógica de la E/S?
Permite probar la lógica con tests rápidos sin tocar archivos reales y reutilizarla desde otros scripts o desde una API.
¿Para qué sirve este prompt?
Escribe un script de línea de comandos en Python listo para producción: argparse, logging, gestión de errores, códigos de salida y tests con pytest.
¿Con qué herramientas de IA funciona?
Está pensado para ChatGPT, Claude y Microsoft Copilot. Todavía no lo hemos verificado en estas herramientas, por lo que los resultados pueden variar entre ellas.
¿Cómo personalizo el prompt?
Pulsa «Personalizar» y rellena las variables (Nombre del script, Tarea, Entradas, Salidas, Versión de Python y Dependencias permitidas). El texto se actualiza al instante y después puedes copiarlo con un clic. Los valores se guardan solo en tu navegador.
¿Necesito experiencia para usarlo?
Es de nivel intermedio: conviene que conozcas el tema para aportar buen contexto y revisar el resultado con criterio.
¿Este prompt es gratis?
Sí. Todos los prompts de HomeCasa Prompts son gratuitos, sin registro ni suscripción. Puedes usarlos también en proyectos profesionales.
¿Puedo fiarme del resultado de la IA?
Úsalo como un borrador de calidad: revisa siempre datos, cifras y afirmaciones importantes antes de publicarlos o tomar decisiones.