diff options
Diffstat (limited to 'Lib/idlelib/PyShell.py')
-rw-r--r-- | Lib/idlelib/PyShell.py | 315 |
1 files changed, 106 insertions, 209 deletions
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py index 3e512e3..d335c7e 100644 --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -1,34 +1,10 @@ #! /usr/bin/env python -# changes by dscherer@cmu.edu - -# The main() function has been replaced by a whole class, in order to -# address the constraint that only one process can sit on the port -# hard-coded into the loader. - -# It attempts to load the RPC protocol server and publish itself. If -# that fails, it assumes that some other copy of IDLE is already running -# on the port and attempts to contact it. It then uses the RPC mechanism -# to ask that copy to do whatever it was instructed (via the command -# line) to do. (Think netscape -remote). The handling of command line -# arguments for remotes is still very incomplete. - -# Default behavior (no command line options) is to open an editor window -# instead of starting the Python Shell. However, if called as -# Pyshell.main(0), the Shell will be started instead of the editor window. - -# In the default editor mode, if files are specified, they are opened. - -# If any command line options are specified, a shell does appear, and if -# the -e option is used, both a shell and an editor window open. - import os -import spawn import sys import string import getopt import re -import protocol import socket import time import warnings @@ -44,13 +20,14 @@ from EditorWindow import EditorWindow, fixwordbreaks from FileList import FileList from ColorDelegator import ColorDelegator from UndoDelegator import UndoDelegator -from OutputWindow import OutputWindow, OnDemandOutputWindow +from OutputWindow import OutputWindow from configHandler import idleConf import idlever import rpc -use_subprocess = 0 # Set to 1 to spawn subprocess for command execution +# XX hardwire this for now, remove later KBK 09Jun02 +use_subprocess = 1 # Set to 1 to spawn subprocess for command execution # Change warnings module to write to sys.__stderr__ try: @@ -204,9 +181,6 @@ class ModifiedInterpreter(InteractiveInterpreter): InteractiveInterpreter.__init__(self, locals=locals) self.save_warnings_filters = None - global flist - self.output = OnDemandOutputWindow(flist) - rpcclt = None rpcpid = None @@ -226,14 +200,14 @@ class ModifiedInterpreter(InteractiveInterpreter): if i > 3: print >>sys.__stderr__, "Socket error:", err, "; retry..." else: - # XXX Make this a dialog? + # XXX Make this a dialog? #GvR print >>sys.__stderr__, "Can't spawn subprocess!" + # XXX Add Stephen's error msg, resolve the two later... KBK 09Jun02 + display_port_binding_error() return - self.output.stdout=PseudoFile(self.output, "stdout") - self.output.stderr=PseudoFile(self.output, "stderr") - self.rpcclt.register("stdin", self.output) - self.rpcclt.register("stdout", self.output.stdout) - self.rpcclt.register("stderr", self.output.stderr) + self.rpcclt.register("stdin", self.tkconsole) + self.rpcclt.register("stdout", self.tkconsole.stdout) + self.rpcclt.register("stderr", self.tkconsole.stderr) self.rpcclt.register("flist", self.tkconsole.flist) self.poll_subprocess() @@ -629,7 +603,7 @@ class PyShell(OutputWindow): def begin(self): self.resetoutput() - self.write("Python %s on %s\n%s\nIDLE Fork %s -- press F1 for help\n" % + self.write("Python %s on %s\n%s\nGRPC IDLE Fork %s\n" % (sys.version, sys.platform, self.COPYRIGHT, idlever.IDLE_VERSION)) try: @@ -795,8 +769,9 @@ class PyShell(OutputWindow): i = i-1 line = line[:i] more = self.interp.runsource(line) - if not more: - self.showprompt() + # XXX This was causing extra prompt with shell KBK +# if not more: +# self.showprompt() def cancel_check(self, frame, what, args, dooneevent=tkinter.dooneevent, @@ -876,6 +851,7 @@ class PseudoFile: def isatty(self): return 1 + usage_msg = """\ usage: idle.py [-c command] [-d] [-i] [-r script] [-s] [-t title] [arg] ... @@ -886,194 +862,115 @@ idle file(s) (without options) edit the file(s) -e edit mode; arguments are files to be edited -i open an interactive shell -i file(s) open a shell and also an editor window for each file --r script use experimental remote (subprocess) execution feature +-r -s run $IDLESTARTUP or $PYTHONSTARTUP before anything else -t title set title of shell window Remaining arguments are applied to the command (-c) or script (-r). """ -class usageError: - def __init__(self, string): self.string = string - def __repr__(self): return self.string - -class main: - def __init__(self, noshell=1): - - global flist, root - root = Tk(className="Idle") - fixwordbreaks(root) - root.withdraw() - flist = PyShellFileList(root) - - # the following causes lockups and silent failures when debugging - # changes to EditorWindow.__init__ ; the console works fine for idle - # debugging in any case, so disable this unnescesary stuff. - #dbg=OnDemandOutputWindow(flist) - #dbg.set_title('IDLE Debugging Messages') - #sys.stdout = PseudoFile(dbg,['stdout']) - #sys.stderr = PseudoFile(dbg,['stderr']) - - try: - self.server = protocol.Server(connection_hook = self.address_ok) - protocol.publish( 'IDLE', self.connect ) - self.main(sys.argv[1:], noshell) - return - except protocol.connectionLost: - try: - client = protocol.Client() - IDLE = client.getobject('IDLE') - if IDLE: - try: - IDLE.remote( sys.argv[1:] ) - except usageError, msg: - sys.stderr.write("Error: %s\n" % str(msg)) - sys.stderr.write(usage_msg) - return - except protocol.connectionLost: - pass - - #maybe the following should be handled by a tkmessagebox for - #users who don't start idle from a console?? - print """\ +def main(): + cmd = None + edit = 0 + debug = 0 + script = None + startup = 0 + + try: + opts, args = getopt.getopt(sys.argv[1:], "c:deir:st:") + except getopt.error, msg: + sys.stderr.write("Error: %s\n" % str(msg)) + sys.stderr.write(usage_msg) + sys.exit(2) + + for o, a in opts: + if o == '-c': + cmd = a + if o == '-d': + debug = 1 + if o == '-e': + edit = 1 + if o == '-r': + script = a + if o == '-s': + startup = 1 + if o == '-t': + PyShell.shell_title = a + + if args and args[0] != "-": edit = 1 + + for i in range(len(sys.path)): + sys.path[i] = os.path.abspath(sys.path[i]) + + pathx = [] + if edit: + for filename in args: + pathx.append(os.path.dirname(filename)) + elif args and args[0] != "-": + pathx.append(os.path.dirname(args[0])) + else: + pathx.append(os.curdir) + for dir in pathx: + dir = os.path.abspath(dir) + if not dir in sys.path: + sys.path.insert(0, dir) + + global flist, root + root = Tk(className="Idle") + fixwordbreaks(root) + root.withdraw() + flist = PyShellFileList(root) + + if edit: + for filename in args: + flist.open(filename) + if not args: + flist.new() + else: + if cmd: + sys.argv = ["-c"] + args + else: + sys.argv = args or [""] + + shell = PyShell(flist) + interp = shell.interp + flist.pyshell = shell + + if startup: + filename = os.environ.get("IDLESTARTUP") or \ + os.environ.get("PYTHONSTARTUP") + if filename and os.path.isfile(filename): + interp.execfile(filename) + + if debug: + shell.open_debugger() + if cmd: + interp.execsource(cmd) + elif script: + if os.path.isfile(script): + interp.execfile(script) + else: + print "No script file: ", script + shell.begin() + root.mainloop() + root.destroy() + +def display_port_binding_error(): + print """\ IDLE cannot run. -IDLE needs to use a specific TCP/IP port (7454) in order to execute and +IDLE needs to use a specific TCP/IP port (8833) in order to execute and debug programs. IDLE is unable to bind to this port, and so cannot start. Here are some possible causes of this problem: 1. TCP/IP networking is not installed or not working on this computer 2. Another program is running that uses this port - 3. Another copy of IDLE stopped responding but is still bound to the port - 4. Personal firewall software is preventing IDLE from using this port + 3. Personal firewall software is preventing IDLE from using this port IDLE makes and accepts connections only with this computer, and does not -communicate over the internet in any way. It's use of port 7454 should not +communicate over the internet in any way. Its use of port 8833 should not be a security risk on a single-user machine. """ - dbg.owin.gotoline(1) - dbg.owin.remove_selection() - root.mainloop() # wait for user to read message - - def idle(self): - spawn.kill_zombies() - self.server.rpc_loop() - root.after(25, self.idle) - - # We permit connections from localhost only - def address_ok(self, addr): - return addr[0] == '127.0.0.1' - - def connect(self, client, addr): - return self - - def remote( self, argv ): - # xxx Should make this behavior match the behavior in main, or redo - # command line options entirely. - - try: - opts, args = getopt.getopt(argv, "c:deist:") - except getopt.error, msg: - raise usageError(msg) - - for filename in args: - flist.open(filename) - if not args: - flist.new() - - def main(self, argv, noshell): - cmd = None - edit = 0 - debug = 0 - interactive = 0 - script = None - startup = 0 - global use_subprocess - - try: - opts, args = getopt.getopt(sys.argv[1:], "c:deir:st:") - except getopt.error, msg: - sys.stderr.write("Error: %s\n" % str(msg)) - sys.stderr.write(usage_msg) - sys.exit(2) - - for o, a in opts: - noshell = 0 # There are options, bring up a shell - if o == '-c': - cmd = a - if o == '-d': - debug = 1 - if o == '-e': - edit = 1 - if o == '-i': - interactive = 1 - if o == '-r': - edit = 1 - script = a - use_subprocess = 1 - if o == '-s': - startup = 1 - if o == '-t': - PyShell.shell_title = a - - if noshell: edit=1 - if interactive and args and args[0] != "-": edit = 1 - - for i in range(len(sys.path)): - sys.path[i] = os.path.abspath(sys.path[i]) - - pathx = [] - if edit: - for filename in args: - pathx.append(os.path.dirname(filename)) - elif args and args[0] != "-": - pathx.append(os.path.dirname(args[0])) - else: - pathx.append(os.curdir) - for dir in pathx: - dir = os.path.abspath(dir) - if not dir in sys.path: - sys.path.insert(0, dir) - - if edit: - for filename in args: - flist.open(filename) - if not args: - flist.new() - else: - if cmd: - sys.argv = ["-c"] + args - else: - sys.argv = args or [""] - - if noshell: - flist.pyshell = None - else: - shell = PyShell(flist) - interp = shell.interp - flist.pyshell = shell - - if startup: - filename = os.environ.get("IDLESTARTUP") or \ - os.environ.get("PYTHONSTARTUP") - if filename and os.path.isfile(filename): - interp.execfile(filename) - - if debug: - shell.open_debugger() - if cmd: - interp.execsource(cmd) - elif script: - if os.path.isfile(script): - interp.execfile(script) - else: - print "No script file: ", script - shell.begin() - - self.idle() - root.mainloop() - root.destroy() - if __name__ == "__main__": main() |