Skip to content

Commit ec1f6f5

Browse files
authored
gh-95027: Fix regrtest stdout encoding on Windows (#98492)
On Windows, when the Python test suite is run with the -jN option, the ANSI code page is now used as the encoding for the stdout temporary file, rather than using UTF-8 which can lead to decoding errors.
1 parent 82ccbf6 commit ec1f6f5

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

Lib/test/libregrtest/runtest_mp.py

+11-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
from test.libregrtest.setup import setup_tests
2323
from test.libregrtest.utils import format_duration, print_warning
2424

25+
if sys.platform == 'win32':
26+
import locale
27+
2528

2629
# Display the running tests if nothing happened last N seconds
2730
PROGRESS_UPDATE = 30.0 # seconds
@@ -267,11 +270,16 @@ def _run_process(self, test_name: str, tmp_dir: str, stdout_fh: TextIO) -> int:
267270
self.current_test_name = None
268271

269272
def _runtest(self, test_name: str) -> MultiprocessResult:
273+
if sys.platform == 'win32':
274+
# gh-95027: When stdout is not a TTY, Python uses the ANSI code
275+
# page for the sys.stdout encoding. If the main process runs in a
276+
# terminal, sys.stdout uses WindowsConsoleIO with UTF-8 encoding.
277+
encoding = locale.getencoding()
278+
else:
279+
encoding = sys.stdout.encoding
270280
# gh-94026: Write stdout+stderr to a tempfile as workaround for
271281
# non-blocking pipes on Emscripten with NodeJS.
272-
with tempfile.TemporaryFile(
273-
'w+', encoding=sys.stdout.encoding
274-
) as stdout_fh:
282+
with tempfile.TemporaryFile('w+', encoding=encoding) as stdout_fh:
275283
# gh-93353: Check for leaked temporary files in the parent process,
276284
# since the deletion of temporary files can happen late during
277285
# Python finalization: too late for libregrtest.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
On Windows, when the Python test suite is run with the ``-jN`` option, the
2+
ANSI code page is now used as the encoding for the stdout temporary file,
3+
rather than using UTF-8 which can lead to decoding errors. Patch by Victor
4+
Stinner.

0 commit comments

Comments
 (0)