]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-125942: Android: set stdout to `errors="backslashreplace"` (#125943)
authorMalcolm Smith <smith@chaquo.com>
Fri, 25 Oct 2024 00:35:41 +0000 (01:35 +0100)
committerGitHub <noreply@github.com>
Fri, 25 Oct 2024 00:35:41 +0000 (08:35 +0800)
Android stdout/err streams now use `backslashreplace` encoding to ensure readability of the Android log.

Lib/_android_support.py
Lib/test/test_android.py
Misc/NEWS.d/next/Core_and_Builtins/2024-10-24-22-43-03.gh-issue-125942.3UQht1.rst [new file with mode: 0644]

index 353b34fa36aca4b06f7de22ddaeeeb13744cdd91..7572745c851847f6c3cddb49438f9c02d65e94f5 100644 (file)
@@ -31,16 +31,19 @@ def init_streams(android_log_write, stdout_prio, stderr_prio):
     logcat = Logcat(android_log_write)
 
     sys.stdout = TextLogStream(
-        stdout_prio, "python.stdout", sys.stdout.fileno(),
-        errors=sys.stdout.errors)
+        stdout_prio, "python.stdout", sys.stdout.fileno())
     sys.stderr = TextLogStream(
-        stderr_prio, "python.stderr", sys.stderr.fileno(),
-        errors=sys.stderr.errors)
+        stderr_prio, "python.stderr", sys.stderr.fileno())
 
 
 class TextLogStream(io.TextIOWrapper):
     def __init__(self, prio, tag, fileno=None, **kwargs):
+        # The default is surrogateescape for stdout and backslashreplace for
+        # stderr, but in the context of an Android log, readability is more
+        # important than reversibility.
         kwargs.setdefault("encoding", "UTF-8")
+        kwargs.setdefault("errors", "backslashreplace")
+
         super().__init__(BinaryLogStream(prio, tag, fileno), **kwargs)
         self._lock = RLock()
         self._pending_bytes = []
index 2ef9f10fdcc1cc3cf6cbc73b3a2be2f5d6a3c4f8..076190f757204559f713b83de6ce89e6477a5ce6 100644 (file)
@@ -123,13 +123,10 @@ class TestAndroidOutput(unittest.TestCase):
                 self.assertIs(stream.readable(), False)
                 self.assertEqual(stream.fileno(), fileno)
                 self.assertEqual("UTF-8", stream.encoding)
+                self.assertEqual("backslashreplace", stream.errors)
                 self.assertIs(stream.line_buffering, True)
                 self.assertIs(stream.write_through, False)
 
-                # stderr is backslashreplace by default; stdout is configured
-                # that way by libregrtest.main.
-                self.assertEqual("backslashreplace", stream.errors)
-
                 def write(s, lines=None, *, write_len=None):
                     if write_len is None:
                         write_len = len(s)
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-10-24-22-43-03.gh-issue-125942.3UQht1.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-10-24-22-43-03.gh-issue-125942.3UQht1.rst
new file mode 100644 (file)
index 0000000..d1b1ecd
--- /dev/null
@@ -0,0 +1,2 @@
+On Android, the ``errors`` setting of :any:`sys.stdout` was changed from
+``surrogateescape`` to ``backslashreplace``.