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:
- Rutas absolutas: nunca uses rutas relativas como
./datos.csv. Usa la ruta completa:/home/usuario/reportes/datos.csvoC:\Users\usuario\reportes\datos.csv. - Registro de eventos (log): el script debe guardar en un archivo lo que hizo y si ocurrió algún error.
- 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)
- Abre el Programador de tareas desde el menú Inicio.
- Haz clic en Crear tarea básica.
- Asigna un nombre, por ejemplo:
Reporte_Bimbo_Diario. - Elige la frecuencia: Diariamente, Semanalmente, etc.
- Define la hora de inicio.
- En Acción, selecciona Iniciar un programa.
- En Programa, escribe la ruta de Python:
C:\Python311\python.exe. - En Argumentos, escribe la ruta del script:
C:\Users\usuario\bimbo\reporte.py. - 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.