summaryrefslogtreecommitdiff
path: root/Lib/idlelib/run.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2019-10-08 14:32:25 +0300
committerGitHub <noreply@github.com>2019-10-08 14:32:25 +0300
commitb690a2759e62d9ee0b6ea1b20e8f7e4b2cdbf8bb (patch)
treeef8fa0a711cb3780ac5bb33147bea57378322c62 /Lib/idlelib/run.py
parentd05b000c6bcd39dba4f4b2656e45954802649562 (diff)
downloadcpython-git-b690a2759e62d9ee0b6ea1b20e8f7e4b2cdbf8bb.tar.gz
bpo-36698: IDLE no longer fails when write non-encodable characters to stderr. (GH-16583)
It now escapes them with a backslash, as the regular Python interpreter. Added the "errors" field to the standard streams.
Diffstat (limited to 'Lib/idlelib/run.py')
-rw-r--r--Lib/idlelib/run.py36
1 files changed, 17 insertions, 19 deletions
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index 41e0ded440..5bd84aadcd 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -401,18 +401,23 @@ class MyRPCServer(rpc.RPCServer):
# Pseudofiles for shell-remote communication (also used in pyshell)
-class PseudoFile(io.TextIOBase):
+class StdioFile(io.TextIOBase):
- def __init__(self, shell, tags, encoding=None):
+ def __init__(self, shell, tags, encoding='utf-8', errors='strict'):
self.shell = shell
self.tags = tags
self._encoding = encoding
+ self._errors = errors
@property
def encoding(self):
return self._encoding
@property
+ def errors(self):
+ return self._errors
+
+ @property
def name(self):
return '<%s>' % self.tags
@@ -420,7 +425,7 @@ class PseudoFile(io.TextIOBase):
return True
-class PseudoOutputFile(PseudoFile):
+class StdOutputFile(StdioFile):
def writable(self):
return True
@@ -428,19 +433,12 @@ class PseudoOutputFile(PseudoFile):
def write(self, s):
if self.closed:
raise ValueError("write to closed file")
- if type(s) is not str:
- if not isinstance(s, str):
- raise TypeError('must be str, not ' + type(s).__name__)
- # See issue #19481
- s = str.__str__(s)
+ s = str.encode(s, self.encoding, self.errors).decode(self.encoding, self.errors)
return self.shell.write(s, self.tags)
-class PseudoInputFile(PseudoFile):
-
- def __init__(self, shell, tags, encoding=None):
- PseudoFile.__init__(self, shell, tags, encoding)
- self._line_buffer = ''
+class StdInputFile(StdioFile):
+ _line_buffer = ''
def readable(self):
return True
@@ -495,12 +493,12 @@ class MyHandler(rpc.RPCHandler):
executive = Executive(self)
self.register("exec", executive)
self.console = self.get_remote_proxy("console")
- sys.stdin = PseudoInputFile(self.console, "stdin",
- iomenu.encoding)
- sys.stdout = PseudoOutputFile(self.console, "stdout",
- iomenu.encoding)
- sys.stderr = PseudoOutputFile(self.console, "stderr",
- iomenu.encoding)
+ sys.stdin = StdInputFile(self.console, "stdin",
+ iomenu.encoding, iomenu.errors)
+ sys.stdout = StdOutputFile(self.console, "stdout",
+ iomenu.encoding, iomenu.errors)
+ sys.stderr = StdOutputFile(self.console, "stderr",
+ iomenu.encoding, "backslashreplace")
sys.displayhook = rpc.displayhook
# page help() text to shell.