Synchronous capture of stdout and stderr
nhodgson at bigpond.net.au
Sat Aug 31 01:59:36 CEST 2002
Konrad Wojas wrote:
> I'm working on a build tool that captures the stdout and stderr of an
> application and mails the output if a compile fails. I'm now using
> popen2.popen3 and the select module, but I don't receive the two streams in
> the same order as the application sends them.
A common problem here is that the application buffers the streams
when writing to a pipe but not when writing to a terminal. Using a pty
instead may convince the child application to run unbuffered. Is there a
flag (like Python's -u) to run the application in unbuffered mode?
While this may improve matters, there is a further problem in that
you are running on a time sharing OS that is unlikely to switch from the
child application to your application after every output. So by the
time your application is activated there may be output available on
both streams and you have no way of discovering the ordering of the two.
There may be several pieces of data available on either stream and there
is no way of discovering the ordering relationship of each byte between
the streams. You could lower the priority of the child application to
try to ensure that your application is activated whenever there is
anything to read but I doubt the scheduler guarantees to switch after
every stream write.
More information about the Python-list