certmundo.
es‑mx

6 min de lectura

¿Cómo programar y agendar scripts de Python con el sistema operativo?

Programar un script de Python con el sistema operativo significa configurar una tarea automática que ejecute tu archivo .py en un horario definido, sin que tú tengas que iniciarlo manualmente.

Esto es útil para reportes diarios, descargas nocturnas o cualquier proceso repetitivo. Los dos mecanismos más comunes son cron (Linux/macOS) y el Programador de tareas (Windows).


Estructura general de un script automatizable

Antes de agendar cualquier script, este debe cumplir tres condiciones:

  1. Rutas absolutas: nunca uses rutas relativas como ./datos.csv. Usa la ruta completa: /home/usuario/reportes/datos.csv o C:\Users\usuario\reportes\datos.csv.
  2. Registro de eventos (log): el script debe guardar en un archivo lo que hizo y si ocurrió algún error.
  3. Manejo de excepciones: si algo falla, el script no debe detenerse sin registrar el motivo.

Esta es la plantilla base recomendada:

import logging
import os
from datetime import datetime

LOG_PATH = "/home/usuario/reportes/tarea.log"

logging.basicConfig(
    filename=LOG_PATH,
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s"
)

def main():
    logging.info("Script iniciado.")
    try:
        # Tu lógica aquí
        logging.info("Proceso completado con éxito.")
    except Exception as e:
        logging.error(f"Error inesperado: {e}")

if __name__ == "__main__":
    main()

Este patrón garantiza que cada ejecución quede registrada con fecha y hora.


Cron en Linux y macOS

Cron es el programador de tareas nativo de Linux y macOS. Funciona con un archivo de configuración llamado crontab.

Sintaxis del crontab

Cada línea del crontab sigue este formato:

MINUTO  HORA  DÍA_MES  MES  DÍA_SEMANA  COMANDO

Los valores posibles son:

Campo Rango Ejemplo
MINUTO 0–59 30 = minuto 30
HORA 0–23 8 = 8:00 a.m.
DÍA_MES 1–31 1 = día 1
MES 1–12 * = todos
DÍA_SEMANA 0–6 (0=domingo) 1 = lunes

Cómo editar el crontab

Ejecuta este comando en tu terminal:

crontab -e

Se abrirá el editor de texto. Agrega tus líneas al final y guarda.

Ejemplos prácticos

Ejemplo 1 — Reporte diario a las 7:00 a.m.

Una empresa como Liverpool necesita un reporte de ventas cada mañana antes de que abra tienda. Agrega esta línea:

0 7 * * * /usr/bin/python3 /home/usuario/reportes/ventas_diarias.py

El * en los campos de día y mes significa "todos los días de todos los meses".

Ejemplo 2 — Descarga de precios cada lunes a las 6:00 a.m.

Un analista de FEMSA necesita actualizar precios de insumos cada inicio de semana:

0 6 * * 1 /usr/bin/python3 /home/analista/femsa/actualizar_precios.py

El 1 en el campo DÍA_SEMANA representa el lunes.

Ejemplo 3 — Limpieza de archivos temporales el día 1 de cada mes

0 0 1 * * /usr/bin/python3 /home/usuario/mantenimiento/limpiar_temp.py

Esto ejecuta el script a medianoche del primer día de cada mes.

Redirigir la salida al log desde cron

Cron no muestra la salida en pantalla. Redirige todo al log así:

0 7 * * * /usr/bin/python3 /home/usuario/reportes/ventas_diarias.py >> /home/usuario/logs/ventas.log 2>&1

El >> agrega al archivo sin borrar el contenido anterior. El 2>&1 captura también los errores del sistema.


Programador de tareas en Windows

En Windows, el equivalente de cron es el Programador de tareas (Task Scheduler). Puedes configurarlo desde la interfaz gráfica o desde la línea de comandos con schtasks.

Configuración gráfica (paso a paso)

  1. Abre el Programador de tareas desde el menú Inicio.
  2. Haz clic en Crear tarea básica.
  3. Asigna un nombre, por ejemplo: Reporte_Bimbo_Diario.
  4. Elige la frecuencia: Diariamente, Semanalmente, etc.
  5. Define la hora de inicio.
  6. En Acción, selecciona Iniciar un programa.
  7. En Programa, escribe la ruta de Python: C:\Python311\python.exe.
  8. En Argumentos, escribe la ruta del script: C:\Users\usuario\bimbo\reporte.py.
  9. Guarda la tarea.

Configuración desde la terminal (schtasks)

Puedes crear la misma tarea con un solo comando:

schtasks /create /tn "Reporte_Bimbo_Diario" /tr "C:\Python311\python.exe C:\Users\usuario\bimbo\reporte.py" /sc daily /st 07:00

Parámetros clave:

Parámetro Significado
/tn Nombre de la tarea
/tr Comando a ejecutar
/sc Frecuencia (daily, weekly, monthly)
/st Hora de inicio (formato HH:MM)

Estrategia de logs para scripts agendados

Un script que corre sin supervisión humana necesita logs detallados. Usa el módulo logging con rotación automática para que el archivo no crezca indefinidamente:

import logging
from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler(
    "/home/usuario/logs/proceso.log",
    maxBytes=1_000_000,
    backupCount=5
)

logging.basicConfig(
    handlers=[handler],
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s"
)

maxBytes=1_000_000 limita el archivo a 1 MB. Cuando llega al límite, crea un nuevo archivo y conserva los últimos 5. Esto evita que los logs llenen el disco.

Niveles de log más usados

Nivel Cuándo usarlo
logging.DEBUG Detalles técnicos para desarrollo
logging.INFO Pasos normales del proceso
logging.WARNING Algo inusual pero no crítico
logging.ERROR Un error que impidió completar una tarea

Manejo de errores en scripts automatizados

Cuando un script falla a las 3:00 a.m., nadie lo ve. Por eso debes anticipar los errores posibles.

Patrón recomendado con reintentos

import logging
import time

def descargar_reporte(intentos=3):
    for i in range(intentos):
        try:
            # Simula descarga de datos de Mercado Libre
            resultado = obtener_ventas_api()
            logging.info(f"Descarga exitosa en intento {i + 1}.")
            return resultado
        except Exception as e:
            logging.warning(f"Intento {i + 1} fallido: {e}")
            time.sleep(10)
    logging.error("Todos los intentos fallaron. Proceso cancelado.")
    return None

Este patrón reintenta hasta 3 veces con una pausa de 10 segundos entre cada intento. Si todos fallan, registra el error y continúa sin romper el proceso completo.


Errores comunes

Error 1 — Usar rutas relativas en el crontab

Cuando cron ejecuta un script, el directorio de trabajo no es el mismo que cuando tú lo corres manualmente. Escribe siempre la ruta absoluta completa: /home/usuario/datos/archivo.csv, no ./datos/archivo.csv.

Error 2 — No encontrar Python en Windows

El Programador de tareas necesita la ruta exacta del ejecutable. Verifica cuál es con este comando en PowerShell:

Get-Command python | Select-Object -ExpandProperty Source

Copia esa ruta completa en la configuración de la tarea.

Error 3 — No redirigir stderr en cron

Si usas solo >> sin 2>&1, los errores del sistema operativo no quedan en tu log. Siempre agrega 2>&1 al final del comando en crontab para capturar ambos tipos de salida.

Error 4 — Variables de entorno no disponibles en cron

Cron no carga el perfil de tu usuario. Si tu script usa variables de entorno (como tokens de API), defínelas directamente en el crontab o carga un archivo .env dentro del script con una ruta absoluta.

SAT_TOKEN=abc123
0 8 * * * /usr/bin/python3 /home/usuario/sat/consulta.py

O bien, dentro del script:

from dotenv import load_dotenv
load_dotenv("/home/usuario/.env")

Resumen de comparación: cron vs Programador de tareas

Característica cron (Linux/macOS) Programador de tareas (Windows)
Configuración Archivo de texto (crontab) Interfaz gráfica o schtasks
Sintaxis de horario MIN HORA DÍA MES DOW Asistente paso a paso
Logs automáticos Redirección manual >> Configurable en propiedades
Variables de entorno Declarar en crontab Configurar en la tarea
Verificar historial Revisar archivo de log Pestaña "Historial" en la GUI

Un script bien agendado con logs adecuados te permite olvidarte del proceso y confiar en que se ejecutará correctamente cada vez.

Puntos clave

  • En Linux y macOS, usa `crontab -e` para agendar scripts. La sintaxis es `MINUTO HORA DÍA_MES MES DÍA_SEMANA COMANDO`. Agrega `>> archivo.log 2>&1` para capturar toda la salida.
  • En Windows, configura el Programador de tareas con la ruta absoluta de `python.exe` y la ruta completa del script. También puedes usar `schtasks` desde la terminal.
  • Siempre usa rutas absolutas en scripts agendados. Las rutas relativas fallan porque el directorio de trabajo del sistema difiere del tuyo.
  • Implementa `logging` con `RotatingFileHandler` para guardar el historial de ejecuciones sin llenar el disco. Registra inicio, éxito y errores en cada ejecución.
  • Las variables de entorno no están disponibles automáticamente en cron. Decláralas en el crontab o cárgalas desde un archivo `.env` con ruta absoluta dentro del script.

Comparte esta lección: