Conceptos básicos de scripting
10 ejemplos para empezar con System Scripting: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con System Scripting: 7 básicos y 3 intermedios.
uv venv && source .venv/bin/activate
# solo stdlib para la mayoría de los ejemplos; typer opcional:
uv pip install "typer>=0.15"Protege los efectos secundarios para que las importaciones permanezcan seguras.
def main() -> int:
print("ejecutando")
return 0
if __name__ == "__main__":
raise SystemExit(main())main() devuelve un código de salida entero para cron y CI.raise SystemExit evita sys.exit en código adyacente a la biblioteca.Relacionado: Scripts robustos - códigos de salida y registro
Analiza indicadores y argumentos posicionales sin dependencias adicionales.
import argparse
def main() -> int:
parser = argparse.ArgumentParser(description="Archivar logs")
parser.add_argument("--dry-run", action="store_true")
parser.add_argument("path")
args = parser.parse_args()
print(args.path, args.dry_run)
return 0
if __name__ == "__main__":
raise SystemExit(main())action="store_true" para indicadores booleanos.ArgumentParser.add_argument para reglas complejas.Relacionado: Automatización de archivos y directorios - manejo de rutas
Las rutas orientadas a objetos superan a la concatenación de cadenas.
from pathlib import Path
root = Path("data")
for csv in root.glob("**/*.csv"):
print(csv.resolve())/ une segmentos de ruta de forma portable.glob("**/*.csv") recorre recursivamente con ** (sigue los enlaces simbólicos con cuidado)..read_text(encoding="utf-8") en lugar de open() cuando el archivo completo cabe en memoria.Relacionado: Automatización de archivos y directorios - escrituras seguras
Los registros estructurados sobreviven al correo electrónico de cron y a los agregadores de registros.
import logging
logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s")
log = logging.getLogger("backup")
def main() -> int:
log.info("inicio de la copia de seguridad")
return 0--verbose.Relacionado: Scripts robustos - registro operacional
Los llamadores distinguen los modos de fallo a través del estado de salida.
EXIT_OK = 0
EXIT_USAGE = 2
EXIT_FAIL = 1
def main() -> int:
return EXIT_OK--help o README para los operadores.2 señala comúnmente errores de uso (argparse usa esto).Relacionado: Scripts robustos - manejo de fallos
Lee la configuración del entorno para scripts de 12 factores.
import os
API_URL = os.environ.get("API_URL", "https://api.example.com")
TOKEN = os.environ["API_TOKEN"] # requerido - lanza KeyError si faltaRelacionado: Trabajar con APIs y Webhooks - llamadas autenticadas
Delega a herramientas externas con listas de argumentos explícitas.
import subprocess
def run_git_status() -> int:
proc = subprocess.run(["git", "status", "--short"], check=False)
return proc.returncodeshell=True a menos que sea inevitable.check=False te permite mapear los códigos de retorno tú mismo.capture_output=True al analizar resultados.Relacionado: subprocess e Interoperabilidad de Shell - captura y tiempos de espera
CLI tipada con menos código repetitivo que argparse puro.
import typer
app = typer.Typer()
@app.command()
def greet(name: str, loud: bool = False) -> None:
msg = f"hola {name}"
typer.echo(msg.upper() if loud else msg)
if __name__ == "__main__":
app()uv run script.py en la tabla de scripts de pyproject.toml.Relacionado: Programación y Cron - CLIs de Typer programadas
Fusiona valores predeterminados, configuración de archivo y banderas de CLI (lo último prevalece).
from dataclasses import dataclass
@dataclass
class Config:
retries: int = 3
dry_run: bool = False
def resolve_config(cli_retries: int | None, base: Config) -> Config:
if cli_retries is not None:
return Config(retries=cli_retries, dry_run=base.dry_run)
return baseConfig simplifican las pruebas.Relacionado: Scripts robustos - modo dry-run
Omite el trabajo cuando la salida ya existe a menos que se use --force.
from pathlib import Path
def build_report(out: Path, force: bool) -> int:
if out.exists() and not force:
print(f"omitir existente {out}")
return 0
out.write_text("datos del informe\n", encoding="utf-8")
return 0--force documenta la sobrescritura intencional.Relacionado: Automatización de archivos y directorios - escrituras atómicas
Versiones de la pila: Esta página se escribió para Python 3.14.0 (estable 3.14, mantenimiento 3.13), 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+.
Revisado por Chris St. John·Última actualización: 16 jul 2026