diff Lib/idlelib/PyShell.py @ 78275:fa7d4ecc6357 2.7

Issue #15318: Prevent writing to sys.stdin. Patch by Roger Serwy and myself.
author Martin v. Löwis <martin@v.loewis.de>
date Wed, 25 Jul 2012 10:56:22 +0200
parents 4f891f44ec15
children 8f1a8e80f330
line wrap: on
line diff
--- a/Lib/idlelib/PyShell.py	Tue Jul 24 14:24:42 2012 -0400
+++ b/Lib/idlelib/PyShell.py	Wed Jul 25 10:56:22 2012 +0200
@@ -11,6 +11,7 @@
 import threading
 import traceback
 import types
+import io
 
 import linecache
 from code import InteractiveInterpreter
@@ -422,6 +423,9 @@
         except socket.timeout, err:
             self.display_no_subprocess_error()
             return None
+        # Can't regiter self.tkconsole.stdin, since run.py wants to
+        # call non-TextIO methods on it (such as getvar)
+        # XXX should be renamed to "console"
         self.rpcclt.register("stdin", self.tkconsole)
         self.rpcclt.register("stdout", self.tkconsole.stdout)
         self.rpcclt.register("stderr", self.tkconsole.stderr)
@@ -875,13 +879,14 @@
         self.save_stderr = sys.stderr
         self.save_stdin = sys.stdin
         from idlelib import IOBinding
+        self.stdin = PseudoInputFile(self)
         self.stdout = PseudoFile(self, "stdout", IOBinding.encoding)
         self.stderr = PseudoFile(self, "stderr", IOBinding.encoding)
         self.console = PseudoFile(self, "console", IOBinding.encoding)
         if not use_subprocess:
             sys.stdout = self.stdout
             sys.stderr = self.stderr
-            sys.stdin = self
+            sys.stdin = self.stdin
         #
         self.history = self.History(self.text)
         #
@@ -1279,6 +1284,15 @@
     def isatty(self):
         return True
 
+class PseudoInputFile(object):
+    def __init__(self, shell):
+        self.readline = shell.readline
+        self.isatty = shell.isatty
+
+    def write(self, s):
+        raise io.UnsupportedOperation("not writable")
+    writelines = write
+
 
 usage_msg = """\