Trouble with popen2

Rembrandt Q Einstein hercules.rockefeller at springfield.??.us
Mon Sep 27 15:13:00 EDT 2004


I am running an external command and I need to know a) when it is done 
and b) what it wrote to both stdout and stderr.  After a little 
searching, I found the popen2 module and used the Popen3 class.  I'm 
having trouble with it hanging, though.

Here is a very well put (by someone else) posting that describes some 
background:

http://mail.python.org/pipermail/python-list/2004-July/230837.html

I came to a similar conclusion as that poster and his workaround 
(independently discovered by me) does do the job he requires.  However, 
I need to also read stderr, so I made this sample writer and runner:

-------
#!/usr/bin/python

import sys

for line in range(0, int(sys.argv[1])):
     print "X" * 120

print >>sys.stderr, "hi"
-------
#!/usr/bin/python

import popen2

f = popen2.Popen3("./writer.py 50000", True)
outs = []
errs = []
while (f.poll() == -1):
     errs += f.childerr.readlines()
     outs += f.fromchild.readlines()
-----


This hangs in the childerr.readlines().  Is it blocking?  If so, why? 
In any case, how can I be sure to read ALL data from BOTH stderr and 
stdout and not be in danger of hanging?


PS: I just found that if I swap the order of the readlines() statements, 
it works.  But I don't want to use that until I understand why.  I 
suspect it's a race condition and I don't want to rely on that.



More information about the Python-list mailing list