subprocess.Popen and ordering writes to stdout and stderr

Chris Withers chris at simplistix.co.uk
Thu Dec 17 16:15:55 EST 2009


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?

Chris

-- 
Simplistix - Content Management, Batch Processing & Python Consulting
            - http://www.simplistix.co.uk



More information about the Python-list mailing list