Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capture subprocess output [duplicate]

Tags:

I learned that when executing commands in Python, I should use subprocess. What I'm trying to achieve is to encode a file via ffmpeg and observe the program output until the file is done. Ffmpeg logs the progress to stderr.

If I try something like this:

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) 

the programm does not continue after calling child.communicate() and waits for the command to complete. Is there any other way to follow the output?

like image 254
schneck Avatar asked Mar 26 '10 17:03

schneck


1 Answers

communicate() blocks until the child process returns, so the rest of the lines in your loop will only get executed after the child process has finished running. Reading from stderr will block too, unless you read character by character like so:

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

This will provide you with real-time output. Taken from Nadia's answer here.

like image 147
Vlad the Impala Avatar answered Oct 13 '22 15:10

Vlad the Impala