import subprocess, threading, sys, os ##################################### def windows_binary(): # version 2010/12/01 try: # Windows needs stdio set for binary mode. import msvcrt msvcrt.setmode (0, os.O_BINARY) # stdin = 0 msvcrt.setmode (1, os.O_BINARY) # stdout = 1 msvcrt.setmode (2, os.O_BINARY) # stderr = 2 except ImportError: pass ##################################### class IOMix(): def __init__( self, fh, encoding="UTF-8"): if hasattr( fh, 'buffer'): self._bio = fh.buffer fh.flush() self._last = 'b' import io self._txt = io.TextIOWrapper( self._bio, encoding, None, '\n') self._encoding = encoding else: raise ValueError("not a buffered stream") def write( self, param ): if isinstance( param, str ): self._last = 't' self._txt.write( param ) else: if self._last == 't': self._txt.flush() self._last = 'b' self._bio.write( param ) def flush( self ): self._txt.flush() def close( self ): self.flush() self._txt.close() self._bio.close() ##################################### def stdio_binary( encoding="UTF-8"): # if hasattr( sys.stdin, 'buffer'): # sys.stdin = sys.stdin.buffer # sys.stderr.write("buffer obtained\n") sys.stdin = sys.stdin.detach() sys.stdout = IOMix( sys.stdout, encoding ) sys.stderr = IOMix( sys.stderr, encoding ) ##################################### def test( parm ): cmdline = ["c:\\python32\\python.exe"] if parm[ -2: ] == "-u": cmdline.append("-u") cmdline.append("test.py") cmdline.append( parm ) print( cmdline ) p = subprocess.Popen( cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE, ) fromstdout = p.stdout.read() status = p.wait() if fromstdout == b"abc\r\ndef\r\n": print("All OK") else: print("Not OK:", repr( fromstdout )) ##################################### if len( sys.argv ) > 2: test( sys.argv[ 2 ]) exit() if len( sys.argv ) > 1: if sys.argv[ 1 ][ 0 ] == "1": windows_binary() sys.stdout.buffer.write(b"abc\r\n") sys.stdout.buffer.write(b"def\r\n") elif sys.argv[ 1 ][ 0 ] == "2": stdio_binary() sys.stdout.write(b"abc\r\n") sys.stdout.write(b"def\r\n") elif sys.argv[ 1 ][ 0 ] == "3": windows_binary() stdio_binary() sys.stdout.write(b"abc\r\n") sys.stdout.write(b"def\r\n") else: sys.stdout.buffer.write(b"abc\r\n") sys.stdout.buffer.write(b"def\r\n")