From f58087ba29d79feae0eb05b9a3db01ba3b24f163 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 2 May 2010 17:24:51 +0000 Subject: [PATCH] Issue #8533: revert r80694; try a different fix: regrtest uses backslashreplace error handler for stdout to avoid UnicodeEncodeError (write non-ASCII character to stdout using ASCII encoding) --- Lib/test/regrtest.py | 15 +++++++++++++-- Lib/test/support.py | 2 +- Misc/NEWS | 4 ++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index ec49b9564c..a4ebff436c 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -376,6 +376,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, elif o in ('-j', '--multiprocess'): use_mp = int(a) elif o == '--slaveargs': + replace_stdout() args, kwargs = json.loads(a) try: result = runtest(*args, **kwargs) @@ -514,6 +515,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, else: tests = iter(selected) + replace_stdout() + if use_mp: try: from threading import Thread @@ -727,6 +730,14 @@ def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS): tests.append(modname) return stdtests + sorted(tests) +def replace_stdout(): + """Set stdout encoder error handler to backslashreplace (as stderr error + handler) to avoid UnicodeEncodeError when printing a traceback""" + stdout = sys.stdout + sys.stdout = open(stdout.fileno(), 'w', + encoding=stdout.encoding, + errors="backslashreplace") + def runtest(test, verbose, quiet, testdir=None, huntrleaks=False, debug=False, use_resources=None): """Run a single test. @@ -939,8 +950,8 @@ def runtest_inner(test, verbose, quiet, print("test", test, "crashed --", str(type) + ":", value) sys.stdout.flush() if verbose or debug: - traceback.print_exc(file=sys.stderr) - sys.stderr.flush() + traceback.print_exc(file=sys.stdout) + sys.stdout.flush() return FAILED, test_time else: if refleak: diff --git a/Lib/test/support.py b/Lib/test/support.py index 3c4d5d6bcf..4ea6c055a7 100644 --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -1020,7 +1020,7 @@ def check_impl_detail(**guards): def _run_suite(suite): """Run tests from a unittest.TestSuite-derived class.""" if verbose: - runner = unittest.TextTestRunner(sys.stderr, verbosity=2) + runner = unittest.TextTestRunner(sys.stdout, verbosity=2) else: runner = BasicTestRunner() diff --git a/Misc/NEWS b/Misc/NEWS index e30315a1db..d822584bd5 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1201,8 +1201,8 @@ Documentation Tests ----- -- Issue #8533: Write tracebacks and failed tests to sys.stderr instead of - sys.stdout to avoid UnicodeEncodeError (use backslashreplace error handler) +- Issue #8533: regrtest uses backslashreplace error handler for stdout to avoid + UnicodeEncodeError (write non-ASCII character to stdout using ASCII encoding) - Issue #8576: Remove use of find_unused_port() in test_smtplib and test_multiprocessing. Patch by Paul Moore. -- 2.40.0