2010-03-26 10 views
24

Me enteré de que al ejecutar comandos en Python, debería usar un subproceso. Lo que estoy tratando de lograr es codificar un archivo a través de ffmpeg y observar la salida del programa hasta que el archivo esté listo. Ffmpeg registra el progreso en stderr.Salida del subproceso de captura

Si intento algo como esto:

child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE) 
complete = False 
while not complete: 
    stderr = child.communicate() 

    # Get progress 
    print "Progress here later" 
    if child.poll() is not None: 
     complete = True 
    time.sleep(2) 

la Programm no continúa después de llamar child.communicate() y espera a que se complete el comando. ¿Hay alguna otra forma de seguir la salida?

+0

relacionado: [Python: lee la entrada de transmisión de subprocess.communicate()] (http://stackoverflow.com/q/2715847/4279) – jfs

Respuesta

26

comunique() bloques hasta que el proceso hijo regrese, por lo que el resto de las líneas de su ciclo solo se ejecutarán después de el proceso hijo ha terminado de ejecutarse. Leyendo de stderr bloqueará también, a menos que lea carácter por carácter, así:

import subprocess 
import sys 
child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE) 
while True: 
    out = child.stderr.read(1) 
    if out == '' and child.poll() != None: 
     break 
    if out != '': 
     sys.stdout.write(out) 
     sys.stdout.flush() 

Esto le proporcionará con salida en tiempo real. Tomado de la respuesta de Nadia here.

+0

No vi esta respuesta - mi pregunta es un duplicado. gracias. – schneck

+3

en este script, la variable 'complete' no tiene uso. –

+0

@JoaoMilasch editado, gracias! –

1

.communicate() "Leer los datos de stdout y stderr, hasta que se alcance el final del archivo. Espere a que finalice el proceso."

En su lugar, debería poder simplemente leer desde child.stderr como un archivo normal.

Cuestiones relacionadas