HOWTO · Python

Reiniciar el script en Python

Este tutorial demuestra cómo reiniciar el programa dentro del programa en Python

En esta página

Para reiniciar un script de Python, decide si necesitas un proceso de intérprete nuevo o solo repetir el trabajo de tu programa. os.execv() reemplaza el proceso actual, subprocess.call() inicia un proceso hijo y espera a que termine, y un bucle puede volver a ejecutar la lógica de tu aplicación sin reiniciar Python.

Método 1: Reemplazar el proceso actual con os.execv()

Usa os.execv() cuando quieras reemplazar el intérprete actual por una nueva ejecución del mismo script. Pasa el intérprete activo como ejecutable y la lista de argumentos del script como argumentos:

os.execv(sys.executable, [sys.executable, *sys.argv])

Importa os y sys, y luego llama a esta expresión cuando se cumpla la condición de reinicio. sys.argv incluye la ruta del script y los argumentos que se le pasaron, por lo que el nuevo intérprete los recibe de nuevo. Si execv() se ejecuta correctamente, no vuelve al código Python anterior: el sistema operativo ejecuta el programa que lo reemplaza en el mismo espacio de proceso. Vacía los búferes de cualquier salida que quieras conservar antes de reemplazar el proceso. Esta operación depende de la plataforma y aquí no se muestra como un ejemplo ejecutado.

Método 2: Iniciar un proceso nuevo con subprocess.call()

Usa subprocess.call() cuando quieras que un intérprete independiente ejecute el script mientras el proceso actual permanece como su proceso padre. La llamada es subprocess.call([sys.executable, *sys.argv]); primero importa subprocess y sys. Espera a que termine el proceso hijo y luego devuelve su estado de salida al proceso padre. El proceso padre no finaliza automáticamente, así que, si quieres que se detenga, retorna o sal de la rama de reinicio después de la llamada. El proceso hijo puede heredar la misma lógica de reinicio; asegúrate de que la condición finalmente permita que la ejecución termine. Aquí no se muestra este comportamiento de inicio de procesos como una salida ejecutada.

Método 3: Repetir la lógica del programa con un bucle

Si solo necesitas volver a ejecutar el trabajo de la aplicación, coloca ese trabajo en una función y llámala desde un bucle controlado. Así mantienes el mismo intérprete y evitas crear una cadena de procesos hijos. El ejemplo usa una secuencia fija de opciones para mostrar dos ejecuciones y una salida normal; sustituye la secuencia por tu entrada o por la condición de tu aplicación.

Ejecuta este ejemplo:

def run_task(number):
    print(f"Run {number}")

for number, action in enumerate(("restart", "restart", "exit"), start=1):
    if action == "exit":
        print("Done")
        break
    run_task(number)
Run 1
Run 2
Done

En un programa de línea de comandos real, lee una acción en cada iteración y llama a run_task() solo cuando el usuario pida repetirla. Define una condición de salida clara para el bucle. Repetir una función no restablece las variables globales de los módulos, los recursos abiertos ni el estado del intérprete; cierra o vuelve a inicializar todo lo que la siguiente ejecución no deba reutilizar.

Elige el método de reinicio adecuado

Usa os.execv() para reemplazar el proceso de un script de ejecución única, subprocess.call() cuando el proceso padre deba esperar a una ejecución independiente, y un bucle cuando quieras repetir una parte concreta del trabajo de la aplicación. Cada opción tiene un ciclo de vida de procesos distinto: tras el reemplazo no queda una trama de Python anterior a la que volver, una ejecución hija mantiene vivo al proceso padre mientras este espera, y un bucle conserva el estado actual del intérprete. En un servicio web, usa el gestor de procesos o los controles de despliegue en lugar de reiniciar un proceso de trabajo desde un controlador de solicitudes; reiniciarlo durante una solicitud puede interrumpir a los usuarios y perder el estado que solo existe en memoria.

Preguntas frecuentes

¿Qué método debería elegir?

Elige un bucle para repetir acciones de la aplicación, os.execv() para reemplazar el proceso actual o subprocess.call() cuando un proceso padre tenga que esperar a que se ejecute un intérprete nuevo.

¿Puede un script reiniciarse automáticamente?

Sí. Una condición, como un cambio de configuración, puede iniciar el reinicio sin pedir confirmación al usuario. Asegúrate de que la condición pueda dejar de cumplirse o de que exista otra forma de terminar el ciclo de reinicios.

¿Reiniciar afecta al rendimiento?

Iniciar un intérprete tiene un coste de arranque, y los reinicios frecuentes pueden repetir el trabajo de inicialización. Un bucle evita ese arranque de proceso, pero conserva el estado actual del intérprete, que quizá tengas que limpiar explícitamente.

¿Puedo pasar argumentos modificados al reiniciar?

Sí. Crea una lista de argumentos nueva para os.execv() o subprocess.call() en lugar de reutilizar sys.argv sin cambios. Coloca primero el ejecutable del intérprete e incluye la ruta del script antes de sus argumentos de aplicación.

¿Debería una aplicación web reiniciar su script desde una solicitud?

Por lo general, no. Reiniciar un proceso de trabajo durante una solicitud puede interrumpir el servicio y descartar el estado que solo existe en memoria. Usa el mecanismo de reinicio y despliegue que admita el servidor o el gestor de procesos.