mirror of https://github.com/python/cpython
gh-125942: Android: set stdout to `errors="backslashreplace"` (#125943)
Android stdout/err streams now use `backslashreplace` encoding to ensure readability of the Android log.
This commit is contained in:
parent
e68d4b08ff
commit
b08570c90e
|
@ -31,16 +31,19 @@ def init_streams(android_log_write, stdout_prio, stderr_prio):
|
||||||
logcat = Logcat(android_log_write)
|
logcat = Logcat(android_log_write)
|
||||||
|
|
||||||
sys.stdout = TextLogStream(
|
sys.stdout = TextLogStream(
|
||||||
stdout_prio, "python.stdout", sys.stdout.fileno(),
|
stdout_prio, "python.stdout", sys.stdout.fileno())
|
||||||
errors=sys.stdout.errors)
|
|
||||||
sys.stderr = TextLogStream(
|
sys.stderr = TextLogStream(
|
||||||
stderr_prio, "python.stderr", sys.stderr.fileno(),
|
stderr_prio, "python.stderr", sys.stderr.fileno())
|
||||||
errors=sys.stderr.errors)
|
|
||||||
|
|
||||||
|
|
||||||
class TextLogStream(io.TextIOWrapper):
|
class TextLogStream(io.TextIOWrapper):
|
||||||
def __init__(self, prio, tag, fileno=None, **kwargs):
|
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("encoding", "UTF-8")
|
||||||
|
kwargs.setdefault("errors", "backslashreplace")
|
||||||
|
|
||||||
super().__init__(BinaryLogStream(prio, tag, fileno), **kwargs)
|
super().__init__(BinaryLogStream(prio, tag, fileno), **kwargs)
|
||||||
self._lock = RLock()
|
self._lock = RLock()
|
||||||
self._pending_bytes = []
|
self._pending_bytes = []
|
||||||
|
|
|
@ -123,13 +123,10 @@ class TestAndroidOutput(unittest.TestCase):
|
||||||
self.assertIs(stream.readable(), False)
|
self.assertIs(stream.readable(), False)
|
||||||
self.assertEqual(stream.fileno(), fileno)
|
self.assertEqual(stream.fileno(), fileno)
|
||||||
self.assertEqual("UTF-8", stream.encoding)
|
self.assertEqual("UTF-8", stream.encoding)
|
||||||
|
self.assertEqual("backslashreplace", stream.errors)
|
||||||
self.assertIs(stream.line_buffering, True)
|
self.assertIs(stream.line_buffering, True)
|
||||||
self.assertIs(stream.write_through, False)
|
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):
|
def write(s, lines=None, *, write_len=None):
|
||||||
if write_len is None:
|
if write_len is None:
|
||||||
write_len = len(s)
|
write_len = len(s)
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
On Android, the ``errors`` setting of :any:`sys.stdout` was changed from
|
||||||
|
``surrogateescape`` to ``backslashreplace``.
|
Loading…
Reference in New Issue