Commit d0f4a325 authored by Victor Stinner's avatar Victor Stinner

Issue #20599: Force ASCII encoding for stdout in test_cleanup() of test_builtin

On Windows, the codec of sys.stdout is implemented in Python. At exit, the
codec may be unloaded before the destructor tries to write something to
sys.stdout.
parent af37b009
...@@ -1604,10 +1604,10 @@ class ShutdownTest(unittest.TestCase): ...@@ -1604,10 +1604,10 @@ class ShutdownTest(unittest.TestCase):
class C: class C:
def __del__(self): def __del__(self):
print("before", flush=True) print("before")
# Check that builtins still exist # Check that builtins still exist
len(()) len(())
print("after", flush=True) print("after")
c = C() c = C()
# Make this module survive until builtins and sys are cleaned # Make this module survive until builtins and sys are cleaned
...@@ -1617,7 +1617,15 @@ class ShutdownTest(unittest.TestCase): ...@@ -1617,7 +1617,15 @@ class ShutdownTest(unittest.TestCase):
# through a GC phase. # through a GC phase.
here = sys.modules[__name__] here = sys.modules[__name__]
""" """
rc, out, err = assert_python_ok("-c", code) # Issue #20599: Force ASCII encoding to get a codec implemented in C,
# otherwise the codec may be unloaded before C.__del__() is called, and
# so print("before") fails because the codec cannot be used to encode
# "before" to sys.stdout.encoding. For example, on Windows,
# sys.stdout.encoding is the OEM code page and these code pages are
# implemented in Python
rc, out, err = assert_python_ok("-c", code,
PYTHONIOENCODING="ascii",
__cleanenv=True)
self.assertEqual(["before", "after"], out.decode().splitlines()) self.assertEqual(["before", "after"], out.decode().splitlines())
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment