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)
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index ec49b95..a4ebff4 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -376,6 +376,7 @@
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 @@
else:
tests = iter(selected)
+ replace_stdout()
+
if use_mp:
try:
from threading import Thread
@@ -727,6 +730,14 @@
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 @@
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: