Skip to content
Snippets Groups Projects
Unverified Commit 965ce0d8 authored by Miss Islington (bot)'s avatar Miss Islington (bot) Committed by Pablo Galindo
Browse files

gh-95027: Fix regrtest stdout encoding on Windows (GH-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.
(cherry picked from commit ec1f6f5f)

Co-authored-by: default avatarVictor Stinner <vstinner@python.org>
parent a1f4e426
No related branches found
No related tags found
No related merge requests found
...@@ -21,6 +21,9 @@ ...@@ -21,6 +21,9 @@
from test.libregrtest.setup import setup_tests from test.libregrtest.setup import setup_tests
from test.libregrtest.utils import format_duration, print_warning from test.libregrtest.utils import format_duration, print_warning
if sys.platform == 'win32':
import locale
# Display the running tests if nothing happened last N seconds # Display the running tests if nothing happened last N seconds
PROGRESS_UPDATE = 30.0 # seconds PROGRESS_UPDATE = 30.0 # seconds
...@@ -259,11 +262,16 @@ def _run_process(self, test_name: str, stdout_fh: TextIO) -> int: ...@@ -259,11 +262,16 @@ def _run_process(self, test_name: str, stdout_fh: TextIO) -> int:
self.current_test_name = None self.current_test_name = None
def _runtest(self, test_name: str) -> MultiprocessResult: def _runtest(self, test_name: str) -> MultiprocessResult:
if sys.platform == 'win32':
# gh-95027: When stdout is not a TTY, Python uses the ANSI code
# page for the sys.stdout encoding. If the main process runs in a
# terminal, sys.stdout uses WindowsConsoleIO with UTF-8 encoding.
encoding = locale.getencoding()
else:
encoding = sys.stdout.encoding
# gh-94026: Write stdout+stderr to a tempfile as workaround for # gh-94026: Write stdout+stderr to a tempfile as workaround for
# non-blocking pipes on Emscripten with NodeJS. # non-blocking pipes on Emscripten with NodeJS.
with tempfile.TemporaryFile( with tempfile.TemporaryFile('w+', encoding=encoding) as stdout_fh:
'w+', encoding=sys.stdout.encoding
) as stdout_fh:
# gh-93353: Check for leaked temporary files in the parent process, # gh-93353: Check for leaked temporary files in the parent process,
# since the deletion of temporary files can happen late during # since the deletion of temporary files can happen late during
# Python finalization: too late for libregrtest. # Python finalization: too late for libregrtest.
......
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. Patch by Victor
Stinner.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment