Running a command line program and reading the result as it runs

Gertjan Klein gklein at xs4all.nl
Fri Aug 23 05:32:00 EDT 2013


Ian Simcock wrote:
> When I use this code I can see that the Popen works, any code between
> the Popen and the for will run straight away, but as soon as it gets to
> the for and tries to read p.stdout the code blocks until the command
> line program completes, then all of the lines are returned.
>> Does anyone know how to get the results of the program without it blocking?

I have tried your code with "ping google.com" as command and got the 
same results; apparently something buffers the output. The result is 
different when using Python 3.3: there, the lines are printed as they 
come in. This seems to indicate a bug in the Python 2.7 implementation.
There are some bug reports on bugs.python.org that may be related; see 
for example:
http://bugs.python.org/issue15532
I have been playing around a bit with the suggested approach of using 
the io library directly. I managed to get unbuffered output, but 
unfortunately the program hangs when the subprocess is done. It can't 
even be terminated with Control-C, I have to use task manager to kill 
python.exe.
Below is as far as I got; perhaps someone with more experience with 
pipes knows how to fix this.
Regards,
Gertjan.
#!/usr/bin/env python2.7
# coding: CP1252
from __future__ import print_function
import subprocess
import io, os
def main():
 i, o = os.pipe()
 piperead = io.open(i, 'rb', buffering=1)
 p = subprocess.Popen(["ping", "google.com"],
 stdout=o,
 stderr=subprocess.PIPE,
 bufsize=0,
 shell=False)
 for line in piperead:
 print(line)
if __name__ == '__main__':
 main()


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /