Ejecutar dos programas al mismo tiempo

publicado por: Anonymous

Imaginemos que tengo dos scripts escritos un python.

El primero se llama programa_1.py y el segundo programa_2.py.

Para ser ejecutado, y debido a que abre unos archivos particulares, el programa_1.py necesita correrse en un directorio denominado, pongamos:

C:Userstest_1

Para ser ejecutado, y debido a que abre otros archivos particulares, el programa_2.py necesita correrse en un directorio denominado, pongamos:

C:Userstest_2

El programa_1 genera un archivo llamado datos_1.csv

El programa_2 genera un archivo llamado datos_2.csv

Mi pregunta:

¿Puedo crear un script nuevo que ejecute ambos programas al mismo tiempo?

solución

Si quieres que se ejecuten de forma completamente paralela (los hilos están limitados en CPython por el GIL) necesitas crear un proceso para cada script.

Tratándose de dos script independientes puedes crear un tercer script y usar subprocess.Popen para crear un proceso por cada script:

#!/usr/bin/env python 

import subprocess


# Iterable con las rutas de los scripts
scripts_paths = ("C:/Users/test_1/script1.py", "C:/Users/test_2/script2.py")

# Creamos cada proceso    
procesos = [subprocess.Popen(["python", script]) for script in scripts_paths]

# Esperamos a que todos los subprocesos terminen.
for proceso in procesos:
    proceso.wait()

# Resto de código a ejecutar cuando terminen todos los subprocesos.

Si necesitas o quieres comprobar si los procesos terminaron o no correctamente puedes usar una lista por compresión que contenga los códigos de salida retornados por wait:

exit_codes = [p.wait() for p in p1, p2]

Generalmente se retorna 0 si el programa terminó con éxito, por lo que puedes condicionar el comportamiento posterior en función de ello:

#!/usr/bin/env python 

import subprocess


scripts_paths = ("C:/Users/test_1/script1.py", "C:/Users/test_2/script2.py")

ps = [subprocess.Popen(["python", script]) for script in scripts_paths]
exit_codes = [p.wait() for p in ps]

if not any(exit_codes):
    print("Todos los procesos terminaroin con éxito")
else:
    print("Algunos procesos terminaron de forma inesperada.")

Si los scripts requieren argumentos se les pueden pasar también sin problemas.

Si necesitas que ambos procesos interacciones entre ellos de forma segura deberá usar multiprocessing y establecer mecanismos seguros de comunicación entre ellos.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *