Comando popen de Python. Espera hasta que el comando termine

Tengo un script donde lanzo con popen un comando de shell. El problema es que la secuencia de comandos no espera hasta que el comando popen finaliza y continúa de inmediato.

om_points = os.popen(command, "w") ..... 

¿Cómo puedo indicarle a mi script de Python que espere hasta que el comando de shell haya finalizado?

Dependiendo de cómo quieras trabajar tu script, tienes dos opciones. Si desea que los comandos bloqueen y no hagan nada mientras se ejecuta, puede usar subprocess.call .

 #start and block until done subprocess.call([data["om_points"], ">", diz['d']+"/points.xml"]) 

Si quieres hacer cosas mientras se está ejecutando o introducir cosas en la stdin , puedes usar communicate después de la llamada popen .

 #start and process things, then wait p = subprocess.Popen([data["om_points"], ">", diz['d']+"/points.xml"]) print "Happens while running" p.communicate() #now wait plus that you can send commands to process 

Como se indica en la documentación, la wait puede interrumpirse, por lo que es recomendable comunicarse.

Puedes usar subprocess para lograr esto.

 import subprocess #This command could have multiple commands separated by a new line \n some_command = "export PATH=$PATH://server.sample.mo/app/bin \n customupload abc.txt" p = subprocess.Popen(some_command, stdout=subprocess.PIPE, shell=True) (output, err) = p.communicate() #This makes the wait possible p_status = p.wait() #This will give you the output of the command being executed print "Command output: " + output 

Lo que buscas es el método de wait .

espera () funciona bien para mí. Los subprocesos p1, p2 y p3 se ejecutan al mismo tiempo. Por lo tanto, todos los procesos se realizan después de 3 segundos.

 import subprocess processes = [] p1 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, shell=True) p2 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, shell=True) p3 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, shell=True) processes.append(p1) processes.append(p2) processes.append(p3) for p in processes: if p.wait() != 0: print("There was an error") print("all processed finished") 

Deja que el comando que intentas pasar sea

 os.system('x') 

entonces lo conviertes en una statement

 t = os.system('x') 

ahora el python estará esperando la salida de la línea de comandos para poder asignarlo a la variable t .