subprocess.Popen and ordering writes to stdout and stderr

exarkun at twistedmatrix.com exarkun at twistedmatrix.com
Thu Dec 17 16:49:44 EST 2009


On 09:15 pm, chris at simplistix.co.uk wrote:
>Hi All,
>
>I have this simple function:
>
>def execute(command):
>     process = Popen(command.split(),stderr=STDOUT,stdout=PIPE)
>     return process.communicate()[0]
>
>..but my unit test for it fails:
>
>from testfixtures import tempdir,compare
>from unittest import TestCase
>
>class TestExecute(TestCase):
>
>     @tempdir()
>     def test_out_and_err(self,d):
>         path = d.write('test.py','\n'.join((
>                 "import sys",
>                 "sys.stdout.write('stdout\\n')",
>                 "sys.stderr.write('stderr\\n')",
>                 "sys.stdout.write('stdout2\\n')",
>                 )),path=True)
>         compare('stdout\nstderr\nstdout2\n',
>                 execute(sys.executable+' '+path))
>
>...because:
>
>AssertionError:
>@@ -1,4 +1,4 @@
>-stdout
>-stderr
>-stdout2
>+stdout
>+stdout2
>+stderr
>
>...the order of the writes isn't preserved.
>How can I get this to be the case?

You probably just need to flush stdout and stderr after each write.  You 
set them up to go to the same underlying file descriptor, but they still 
each have independent buffering on top of that.

Jean-Paul



More information about the Python-list mailing list