Tengo un script en el que lanzo con popen un comando de shell. El problema es que la secuencia de comandos no espera hasta que finalice el comando popen y continúa inmediatamente.
om_points = os.popen(command, "w")
.....
¿Cómo puedo decirle a mi secuencia de comandos de Python que espere hasta que el comando de shell haya finalizado?
python
subprocess
wait
popen
michele
fuente
fuente
subprocess.run()
se agregó en Python 3.5 y es "El enfoque recomendado para invocar subprocesos"Puede utilizar
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
fuente
Obligar
popen
a no continuar hasta que se lea toda la salida haciendo:fuente
Deja que el comando que intentas pasar sea
os.system('x')
luego lo convertiste en una declaración
t = os.system('x')
ahora, Python estará esperando el resultado de la línea de comandos para poder asignarlo a la variable
t
.fuente
Lo que buscas es el
wait
método.fuente
wait
es un método de lasubprocess
clase.wait () 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")
fuente
Creo que process.communicate () sería adecuado para una salida de tamaño pequeño. Para una producción mayor, no sería el mejor enfoque.
fuente