mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
gh-109276, gh-109508: Fix libregrtest stdout (#109903)
Remove replace_stdout(): call sys.stdout.reconfigure() instead of set the error handler to backslashreplace. display_header() logs an empty line and flush stdout. Remove encoding workaround in display_header() since stdout error handler is now set to backslashreplace earlier.
This commit is contained in:
parent
ae1d99c2ed
commit
b1e4f6e83e
4 changed files with 26 additions and 53 deletions
|
@ -1,4 +1,3 @@
|
|||
import atexit
|
||||
import contextlib
|
||||
import faulthandler
|
||||
import locale
|
||||
|
@ -495,32 +494,6 @@ def normalize_test_name(test_full_name, *, is_error=False):
|
|||
return short_name
|
||||
|
||||
|
||||
def replace_stdout():
|
||||
"""Set stdout encoder error handler to backslashreplace (as stderr error
|
||||
handler) to avoid UnicodeEncodeError when printing a traceback"""
|
||||
stdout = sys.stdout
|
||||
try:
|
||||
fd = stdout.fileno()
|
||||
except ValueError:
|
||||
# On IDLE, sys.stdout has no file descriptor and is not a TextIOWrapper
|
||||
# object. Leaving sys.stdout unchanged.
|
||||
#
|
||||
# Catch ValueError to catch io.UnsupportedOperation on TextIOBase
|
||||
# and ValueError on a closed stream.
|
||||
return
|
||||
|
||||
sys.stdout = open(fd, 'w',
|
||||
encoding=stdout.encoding,
|
||||
errors="backslashreplace",
|
||||
closefd=False,
|
||||
newline='\n')
|
||||
|
||||
def restore_stdout():
|
||||
sys.stdout.close()
|
||||
sys.stdout = stdout
|
||||
atexit.register(restore_stdout)
|
||||
|
||||
|
||||
def adjust_rlimit_nofile():
|
||||
"""
|
||||
On macOS the default fd limit (RLIMIT_NOFILE) is sometimes too low (256)
|
||||
|
@ -548,20 +521,12 @@ def adjust_rlimit_nofile():
|
|||
|
||||
|
||||
def display_header(use_resources: tuple[str, ...]):
|
||||
encoding = sys.stdout.encoding
|
||||
|
||||
# Print basic platform information
|
||||
print("==", platform.python_implementation(), *sys.version.split())
|
||||
print("==", platform.platform(aliased=True),
|
||||
"%s-endian" % sys.byteorder)
|
||||
print("== Python build:", ' '.join(get_build_info()))
|
||||
|
||||
cwd = os.getcwd()
|
||||
# gh-109508: support.os_helper.FS_NONASCII, used by get_work_dir(), cannot
|
||||
# be encoded to the filesystem encoding on purpose, escape non-encodable
|
||||
# characters with backslashreplace error handler.
|
||||
formatted_cwd = cwd.encode(encoding, "backslashreplace").decode(encoding)
|
||||
print("== cwd:", formatted_cwd)
|
||||
print("== cwd:", os.getcwd())
|
||||
|
||||
cpu_count = os.cpu_count()
|
||||
if cpu_count:
|
||||
|
@ -588,18 +553,18 @@ def display_header(use_resources: tuple[str, ...]):
|
|||
sanitizers.append("memory")
|
||||
if ubsan:
|
||||
sanitizers.append("undefined behavior")
|
||||
if not sanitizers:
|
||||
return
|
||||
if sanitizers:
|
||||
print(f"== sanitizers: {', '.join(sanitizers)}")
|
||||
for sanitizer, env_var in (
|
||||
(asan, "ASAN_OPTIONS"),
|
||||
(msan, "MSAN_OPTIONS"),
|
||||
(ubsan, "UBSAN_OPTIONS"),
|
||||
):
|
||||
options= os.environ.get(env_var)
|
||||
if sanitizer and options is not None:
|
||||
print(f"== {env_var}={options!r}")
|
||||
|
||||
print(f"== sanitizers: {', '.join(sanitizers)}")
|
||||
for sanitizer, env_var in (
|
||||
(asan, "ASAN_OPTIONS"),
|
||||
(msan, "MSAN_OPTIONS"),
|
||||
(ubsan, "UBSAN_OPTIONS"),
|
||||
):
|
||||
options= os.environ.get(env_var)
|
||||
if sanitizer and options is not None:
|
||||
print(f"== {env_var}={options!r}")
|
||||
print(flush=True)
|
||||
|
||||
|
||||
def cleanup_temp_dir(tmp_dir: StrPath):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue