Ejecutar un script de Python automáticamente cuando Windows se inicia es útil para tareas de supervisión, copias de seguridad, organización de archivos, sincronización, generación de informes y automatizaciones internas. Existen varias formas de hacerlo, pero las más prácticas son la carpeta de Inicio, el Programador de tareas y un archivo por lotes. La mejor opción depende de si necesitas una ejecución simple, privilegios elevados, retrasos, repetición o recuperación ante errores.
Antes de configurar el inicio automático, asegúrate de que el script funcione manualmente. También resulta útil conocer cómo evitar que un script se bloquee, cómo registrar eventos con logging, cómo leer variables de entorno de forma segura y cómo organizar archivos del PC con Python.
Preparar el script
Un script ejecutado durante el inicio no debe depender del directorio actual. Utiliza rutas absolutas construidas con pathlib:
from pathlib import Path
import logging
BASE = Path(__file__).resolve().parent
LOG = BASE / "inicio.log"
logging.basicConfig(
filename=LOG,
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s"
)
logging.info("El script se inició correctamente")Cuando Windows ejecuta una tarea, el directorio de trabajo puede ser C:\Windows\System32. Si el programa usa rutas relativas como datos/config.json, es posible que no encuentre los archivos. Basar las rutas en __file__ evita ese problema.
Comprobar el intérprete correcto
En CMD ejecuta:
where python
py -0pEl primer comando muestra los ejecutables encontrados en PATH. El segundo lista las instalaciones registradas por Python Launcher. Guarda la ruta del intérprete que tiene las dependencias necesarias. Cuando el proyecto utiliza un entorno virtual, normalmente será:
C:\ruta\proyecto\.venv\Scripts\python.exeNo confíes en que python apunte al mismo intérprete durante el inicio. Es preferible utilizar la ruta completa.
Método 1: carpeta de Inicio
Presiona Win + R, escribe:
shell:startupWindows abrirá la carpeta de Inicio del usuario actual. Crea un acceso directo cuyo destino sea:
"C:\ruta\proyecto\.venv\Scripts\pythonw.exe" "C:\ruta\proyecto\main.py"pythonw.exe ejecuta el programa sin abrir una ventana de consola. Es adecuado para scripts silenciosos, pero también oculta mensajes y errores. Por eso el registro con logging es imprescindible. Durante las pruebas usa python.exe para ver la salida; cambia a pythonw.exe cuando todo esté estable.
La carpeta de Inicio es rápida y sencilla, pero ofrece poco control. La tarea se ejecuta cuando el usuario inicia sesión, no necesariamente cuando el equipo arranca. Tampoco permite definir reintentos, retrasos o condiciones avanzadas.
Método 2: archivo BAT
Crea iniciar_script.bat:
@echo off
cd /d "C:\ruta\proyecto"
"C:\ruta\proyecto\.venv\Scripts\python.exe" "main.py" >> "inicio-bat.log" 2>&1cd /d cambia de unidad y directorio. La redirección >> añade la salida a un archivo y 2>&1 incluye los errores. Puedes colocar un acceso directo al BAT en la carpeta de Inicio.
No almacenes contraseñas, tokens ni claves directamente en el BAT. Utiliza variables de entorno, el Administrador de credenciales de Windows o un sistema de secretos apropiado.
Método 3: Programador de tareas
El Programador de tareas es la opción recomendada para automatizaciones importantes. Permite ejecutar al iniciar sesión, al arrancar el sistema, a una hora determinada o cuando ocurre un evento.
- Abre “Programador de tareas”.
- Selecciona “Crear tarea”, no solamente “Crear tarea básica”.
- Escribe un nombre descriptivo.
- En “Desencadenadores”, elige “Al iniciar sesión” o “Al iniciar el sistema”.
- En “Acciones”, elige “Iniciar un programa”.
- En “Programa o script”, introduce la ruta completa de
python.exeopythonw.exe. - En “Agregar argumentos”, introduce la ruta del script entre comillas.
- En “Iniciar en”, indica la carpeta del proyecto sin comillas.
Ejemplo:
Programa:
C:\proyecto\.venv\Scripts\python.exe
Argumentos:
C:\proyecto\main.py
Iniciar en:
C:\proyectoLa documentación oficial de Microsoft sobre Task Scheduler explica los desencadenadores, acciones, condiciones y configuraciones disponibles.
Configurar un retraso
Algunos scripts necesitan esperar a que la red, una unidad compartida o un servicio esté disponible. En el desencadenador puedes marcar “Retrasar la tarea” durante uno o varios minutos. Otra posibilidad es implementar reintentos:
import time
import requests
import logging
for intento in range(1, 6):
try:
respuesta = requests.get("https://example.com", timeout=10)
respuesta.raise_for_status()
logging.info("Conexión disponible")
break
except requests.RequestException as error:
logging.warning("Intento %s falló: %s", intento, error)
time.sleep(30)
else:
logging.error("No fue posible conectar")Define un número máximo de intentos. Un bucle infinito sin espera puede consumir recursos y llenar el archivo de registro.
Ejecutar con privilegios
Si el script necesita acceder a carpetas protegidas, servicios o configuraciones del sistema, el Programador de tareas permite marcar “Ejecutar con los privilegios más altos”. Úsalo únicamente cuando sea indispensable. Ejecutar código como administrador aumenta el impacto de cualquier error o dependencia comprometida.
También puedes elegir “Ejecutar tanto si el usuario inició sesión como si no”. Windows solicitará credenciales y ejecutará la tarea en segundo plano. En ese modo, las interfaces gráficas no se mostrarán en el escritorio del usuario.
Evitar múltiples instancias
Si el usuario inicia sesión varias veces o la tarea se repite, podrían quedar varias copias. En la configuración de la tarea, selecciona “No iniciar una nueva instancia” cuando ya exista una ejecución. También puedes crear un archivo de bloqueo:
from pathlib import Path
import sys
lock = Path(__file__).with_suffix(".lock")
if lock.exists():
sys.exit("Ya existe una instancia")
try:
lock.write_text(str(Path.cwd()), encoding="utf-8")
# trabajo principal
finally:
lock.unlink(missing_ok=True)Para programas críticos, un mecanismo de bloqueo del sistema es más robusto, pero este patrón sencillo ayuda en automatizaciones personales.
Controlar errores y salida
Cuando el script se ejecuta sin terminal, una excepción puede pasar desapercibida. Configura logging y captura errores en el punto de entrada:
import logging
def main():
logging.info("Comienza el trabajo")
# tareas
logging.info("Trabajo terminado")
if __name__ == "__main__":
try:
main()
except Exception:
logging.exception("Fallo inesperado")
raiseLa guía oficial de Python para Windows documenta el lanzador py, las asociaciones de archivos y las particularidades de la instalación.
Probar la tarea correctamente
En el Programador de tareas, selecciona la tarea y pulsa “Ejecutar”. Revisa “Último resultado de ejecución”, el historial y el archivo de log. El código 0x0 normalmente indica éxito. Si la tarea funciona manualmente pero falla durante el inicio, revisa rutas, permisos, variables de entorno, unidades de red y el campo “Iniciar en”.
Las unidades mapeadas como Z: pueden no existir para una tarea en segundo plano. Usa rutas UNC como \\servidor\carpeta y concede permisos a la cuenta que ejecuta la tarea.
Detener y actualizar el script
Antes de reemplazar archivos, termina la tarea desde el Programador. Mantén el proyecto bajo control de versiones y prueba los cambios en otra ubicación. Si el script se actualiza automáticamente, valida firmas o hashes antes de ejecutar código nuevo. No descargues y ejecutes archivos arbitrarios desde Internet durante el inicio.
Errores frecuentes
Los fallos más comunes son utilizar rutas relativas, seleccionar un Python sin dependencias, omitir “Iniciar en”, depender de una unidad de red no disponible, usar pythonw.exe sin logging y ejecutar con permisos insuficientes. También es habitual que el script espere una entrada con input(); una tarea de fondo no debe requerir interacción.
Conclusión
Para automatizaciones simples, la carpeta de Inicio puede ser suficiente. Para tareas confiables, con reintentos, retrasos, permisos y ejecución en segundo plano, utiliza el Programador de tareas. Emplea rutas absolutas, el intérprete del entorno virtual, registros persistentes y una política que evite instancias duplicadas. Así el script podrá iniciarse con Windows de forma predecible y fácil de mantener.






