Index: build/run_tests.py =================================================================== --- build/run_tests.py (revision 1876712) +++ build/run_tests.py (working copy) @@ -48,6 +48,7 @@ ''' import os, sys, shutil, codecs +import io import re import logging import optparse, subprocess, threading, traceback @@ -844,6 +845,12 @@ # setup the output pipes if self.log: + need_stdout_reconstruct = ( isinstance(sys.stdout, io.IOBase) + and not isinstance(sys.stdout.buffer.raw, + io.FileIO)) + need_stderr_reconstruct = ( isinstance(sys.stderr, io.IOBase) + and not isinstance(sys.stderr.buffer.raw, + io.FileIO)) sys.stdout.flush() sys.stderr.flush() self.log.flush() @@ -851,6 +858,12 @@ old_stderr = os.dup(sys.stderr.fileno()) os.dup2(self.log.fileno(), sys.stdout.fileno()) os.dup2(self.log.fileno(), sys.stderr.fileno()) + if need_stdout_reconstruct: + sys.stdout = open(sys.stdout.fileno(), 'w', encoding='utf-8', + errors='replace', closefd=False) + if need_stderr_reconstruct: + sys.stderr = open(sys.stderr.fileno(), 'w', encoding='utf-8', + errors='replace', closefd=False) # These have to be class-scoped for use in the progress_func() self.dots_written = 0 @@ -897,6 +910,12 @@ os.dup2(old_stderr, sys.stderr.fileno()) os.close(old_stdout) os.close(old_stderr) + if need_stdout_reconstruct: + sys.stdout = open(sys.stdout.fileno(), 'w', encoding='utf-8', + errors='replace', closefd=False) + if need_stderr_reconstruct: + sys.stderr = open(sys.stderr.fileno(), 'w', encoding='utf-8', + errors='replace', closefd=False) return failed