mirror of
https://github.com/python/cpython.git
synced 2025-08-31 22:18:28 +00:00
libpython.py: py-bt commands escape unencodable characters
Encode unicode strings to the terminal encoding with backslashreplace error (as Python does for sys.stderr) before writing them to sys.stdout. It fixes UnicodeEncodeError on writing non-ascii characters in an ascii terminal (C locale: ASCII encoding).
This commit is contained in:
parent
6961bd690e
commit
0e5a41b8f5
1 changed files with 9 additions and 1 deletions
|
@ -88,6 +88,13 @@ def safe_range(val):
|
||||||
# threshold in case the data was corrupted
|
# threshold in case the data was corrupted
|
||||||
return xrange(safety_limit(val))
|
return xrange(safety_limit(val))
|
||||||
|
|
||||||
|
def write_unicode(file, text):
|
||||||
|
# Write a byte or unicode string to file. Unicode strings are encoded to
|
||||||
|
# ENCODING encoding with 'backslashreplace' error handler to avoid
|
||||||
|
# UnicodeEncodeError.
|
||||||
|
if isinstance(text, unicode):
|
||||||
|
text = text.encode(ENCODING, 'backslashreplace')
|
||||||
|
file.write(text)
|
||||||
|
|
||||||
class StringTruncated(RuntimeError):
|
class StringTruncated(RuntimeError):
|
||||||
pass
|
pass
|
||||||
|
@ -1360,7 +1367,8 @@ class Frame(object):
|
||||||
if self.is_evalframeex():
|
if self.is_evalframeex():
|
||||||
pyop = self.get_pyop()
|
pyop = self.get_pyop()
|
||||||
if pyop:
|
if pyop:
|
||||||
sys.stdout.write('#%i %s\n' % (self.get_index(), pyop.get_truncated_repr(MAX_OUTPUT_LEN)))
|
line = pyop.get_truncated_repr(MAX_OUTPUT_LEN)
|
||||||
|
write_unicode(sys.stdout, '#%i %s\n' % (self.get_index(), line))
|
||||||
sys.stdout.write(pyop.current_line())
|
sys.stdout.write(pyop.current_line())
|
||||||
else:
|
else:
|
||||||
sys.stdout.write('#%i (unable to read python frame information)\n' % self.get_index())
|
sys.stdout.write('#%i (unable to read python frame information)\n' % self.get_index())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue