2010-03-26 8 views
24

Ho appreso che durante l'esecuzione di comandi in Python, dovrei utilizzare il sottoprocesso. Quello che sto cercando di ottenere è codificare un file tramite ffmpeg e osservare l'output del programma fino a quando il file non viene completato. Ffmpeg registra il progresso in stderr.Capture subprocess output

Se provo qualcosa di simile:

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) 

il programma non continua dopo aver chiamato child.communicate() e attende il completamento del comando. C'è un altro modo per seguire l'output?

+0

correlati: [Python: leggere lo streaming di input da subprocess.communicate()] (http://stackoverflow.com/q/2715847/4279) – jfs

risposta

26

communicate() blocca fino al ritorno del processo figlio, quindi il resto delle righe nel ciclo verrà eseguito solo dopo il il processo figlio ha terminato l'esecuzione. La lettura da stderr bloccherà troppo, a meno che non si legge carattere per carattere in questo modo:

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() 

questo vi fornirà con uscita in tempo reale. Tratto dalla risposta di Nadia here.

+0

non ho visto questa risposta - la mia domanda è un duplicato. grazie. – schneck

+3

in questo script, la variabile 'complete' non ha senso. –

+0

@JoaoMilasch modificato, grazie! –

1

.communicate() "Legge i dati da stdout e stderr, fino al raggiungimento della fine del file. Attendi il termine del processo."

Invece, dovresti essere in grado di leggere da child.stderr come un normale file.