example - subprocess python español
subprocess.wait() no espera a que finalice el proceso de Popen(cuando se utilizan subprocesos)? (4)
Asegúrese de que todas las aplicaciones a las que está llamando tengan códigos de retorno válidos cuando terminen
Estoy experimentando algunos problemas al usar subprocess.Popen()
para generar varias instancias de la misma aplicación desde mi script de Python usando subprocesos para que se ejecuten simultáneamente. En cada hilo ejecuto la aplicación usando la llamada popen()
, y luego espero a que termine llamando a wait()
. El problema parece ser que la llamada a wait()
no espera realmente a que finalice el proceso. Experimenté utilizando solo un hilo, e imprimiendo mensajes de texto cuando se inicia el proceso y cuando termina. Entonces la función del hilo se vería así:
def worker():
while True:
job = q.get() # q is a global Queue of jobs
print(''Starting process %d'' % job[''id''])
proc = subprocess.Popen(job[''cmd''], shell=True)
proc.wait()
print(''Finished process %d'' % job[''id''])
job.task_done()
Pero incluso cuando solo uso un hilo, se imprimirán varios mensajes de "Proceso de inicio ...", antes de que aparezca el mensaje "Proceso finalizado ...". ¿Hay algún caso en que la wait()
no espere realmente? Tengo varias aplicaciones externas diferentes (aplicaciones de consola C ++), que a su vez tendrán varias instancias ejecutándose simultáneamente, y para algunas de ellas mi código funciona, pero para otras no. ¿Podría haber algún problema con las aplicaciones externas que de alguna manera afecte la llamada a wait()
? El código para crear los hilos se parece a esto:
for i in range(1):
t = Thread(target=worker)
t.daemon = True
t.start()
q.join() # Wait for the queue to empty
Actualización 1 : también debo agregar que para algunas de las aplicaciones externas a veces obtengo un código de retorno ( proc.returncode
) de -1073471801. Por ejemplo, una de las aplicaciones externas dará a ese código de retorno las primeras dos veces que se llama a Popen
, pero no a las dos últimas (cuando tengo cuatro trabajos).
Actualización 2 : Para aclarar las cosas, ahora mismo tengo cuatro trabajos en la cola, que son cuatro casos de prueba diferentes. Cuando ejecuto mi código, para una de las aplicaciones externas, las dos primeras Popen
Popen generan el código de retorno -1073471801. Pero si Popen
comando exacto al que llama Popen
y lo ejecuto en una ventana de comandos, se ejecuta sin ningún problema.
Resuelto Me las arreglé para resolver los problemas que estaba teniendo. Creo que el problema fue mi falta de experiencia en la programación de hilos. Me perdí el hecho de que cuando había creado mis primeros subprocesos de trabajo, seguirían viviendo hasta que salga el script de Python. Por error, creé más subprocesos de trabajo cada vez que coloco nuevos elementos en la cola (lo hago en lotes para cada programa externo que quiero ejecutar). Así que cuando llegué a la cuarta aplicación externa, tenía cuatro subprocesos ejecutándose simultáneamente, aunque solo pensé que tenía uno.
Lamentablemente, al ejecutar su subproceso usando shell=True
, wait() solo esperará a que finalice el subproceso sh
y no al comando cmd
.
Sugeriré si es posible no usar el shell=True
, si no es posible, puede crear un grupo de procesos como en esta answer y usar os.waitpid para esperar al grupo de procesos, no solo al proceso del shell.
Espero que esto haya sido útil :)
También check_call()
usar check_call()
lugar de Popen. check_call()
espera a que finalice el comando, incluso cuando shell=True
y luego devuelve el código de salida del trabajo.
Yo también tenía problemas, pero me inspiré en el tuyo.
El mío se ve así, y funciona muy bien:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags = subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE
proc = subprocess.Popen(command, startupinfo=startupinfo)
proc.communicate()
proc.wait()
Fíjate que esta también oculta la ventana.