summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKurt B. Kaiser <kbk@shore.net>2002-12-11 04:42:04 (GMT)
committerKurt B. Kaiser <kbk@shore.net>2002-12-11 04:42:04 (GMT)
commitf06eed08a899e941c1e6db9b1b5fb126f9e33b85 (patch)
tree234548f6886ac83e103ef0563d4cf765eb1cbc14
parent85f7f83d71e08ccd44ea1e6bf351a7fa0a9c1ba4 (diff)
downloadcpython-f06eed08a899e941c1e6db9b1b5fb126f9e33b85.zip
cpython-f06eed08a899e941c1e6db9b1b5fb126f9e33b85.tar.gz
cpython-f06eed08a899e941c1e6db9b1b5fb126f9e33b85.tar.bz2
Rework the command line interface, incorporating the shell/edit
configuration selection. Rework the usage message to match. Also some minor code polishing.
-rw-r--r--Lib/idlelib/PyShell.py208
1 files changed, 136 insertions, 72 deletions
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py
index 27bae5f..cf93613 100644
--- a/Lib/idlelib/PyShell.py
+++ b/Lib/idlelib/PyShell.py
@@ -10,7 +10,6 @@ import socket
import time
import traceback
import types
-import warnings
import exceptions
import linecache
@@ -32,9 +31,6 @@ import RemoteDebugger
IDENTCHARS = string.ascii_letters + string.digits + "_"
-# 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:
import warnings
@@ -71,10 +67,9 @@ linecache.checkcache = extended_linecache_checkcache
class PyShellEditorWindow(EditorWindow):
"Regular text edit window when a shell is present"
- # XXX KBK 19Oct02 Breakpoints are currently removed if module is
- # changed or closed. Future plans include saving breakpoints in a
- # project file and possibly preserving breakpoints by changing their
- # line numbers as a module is modified.
+ # XXX KBK 10Dec02 Breakpoints are currently removed if module is modified.
+ # In the future, it may be possible to preserve breakpoints by changing
+ # their line numbers as a module is modified.
def __init__(self, *args):
self.breakpoints = []
@@ -317,6 +312,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
self.rpcclt.register("stdout", self.tkconsole.stdout)
self.rpcclt.register("stderr", self.tkconsole.stderr)
self.rpcclt.register("flist", self.tkconsole.flist)
+ self.transfer_path()
self.poll_subprocess()
def restart_subprocess(self):
@@ -328,12 +324,20 @@ class ModifiedInterpreter(InteractiveInterpreter):
self.rpcclt.close()
self.spawn_subprocess()
self.rpcclt.accept()
+ self.transfer_path()
# restart remote debugger
if debug:
gui = RemoteDebugger.restart_subprocess_debugger(self.rpcclt)
# reload remote debugger breakpoints for all PyShellEditWindows
debug.load_breakpoints()
+ def transfer_path(self):
+ self.runcommand("""if 1:
+ import sys as _sys
+ _sys.path = %s
+ del _sys
+ \n""" % `sys.path`)
+
active_seq = None
def poll_subprocess(self):
@@ -586,7 +590,7 @@ class PyShell(OutputWindow):
ColorDelegator = ModifiedColorDelegator
UndoDelegator = ModifiedUndoDelegator
- # Override menus: Run and Format not desired in shell; add Debug
+ # Override menus
menu_specs = [
("file", "_File"),
("edit", "_Edit"),
@@ -1008,108 +1012,168 @@ class PseudoFile:
usage_msg = """\
-usage: idle.py [-c command] [-d] [-i] [-r script] [-s] [-t title] [arg] ...
-idle file(s) (without options) edit the file(s)
+USAGE: idle [-deis] [-t title] [file]*
+ idle [-ds] [-t title] (-c cmd | -r file) [arg]*
+ idle [-ds] [-t title] - [arg]*
+
+ -h print this help message and exit
+
+The following options will override the IDLE 'settings' configuration:
+
+ -e open an edit window
+ -i open a shell window
+
+The following options imply -i and will open a shell:
+
+ -c cmd run the command in a shell, or
+ -r file run script from file
+
+ -d enable the debugger
+ -s run $IDLESTARTUP or $PYTHONSTARTUP before anything else
+ -t title set title of shell window
+
+A default edit window will be bypassed when -c, -r, or - are used.
+
+[arg]* are passed to the command (-c) or script (-r) in sys.argv[1:].
+
+Examples:
--c cmd run the command in a shell
--d enable the debugger
--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
--s run $IDLESTARTUP or $PYTHONSTARTUP before anything else
--t title set title of shell window
+idle
+ Open an edit window or shell depending on IDLE's configuration.
-Remaining arguments are applied to the command (-c) or script (-r).
+idle foo.py foobar.py
+ Edit the files, also open a shell if configured to start with shell.
+
+idle -est "Baz" foo.py
+ Run $IDLESTARTUP or $PYTHONSTARTUP, edit foo.py, and open a shell
+ window with the title "Baz".
+
+idle -c "import sys; print sys.argv" "foo"
+ Open a shell window and run the command, passing "-c" in sys.argv[0]
+ and "foo" in sys.argv[1].
+
+idle -d -s -r foo.py "Hello World"
+ Open a shell window, run a startup script, enable the debugger, and
+ run foo.py, passing "foo.py" in sys.argv[0] and "Hello World" in
+ sys.argv[1].
+
+echo "import sys; print sys.argv" | idle - "foobar"
+ Open a shell window, run the script piped in, passing '' in sys.argv[0]
+ and "foobar" in sys.argv[1].
"""
def main():
+ global flist, root, use_subprocess
+
+ enable_shell = False
+ enable_edit = False
+ debug = False
cmd = None
- edit = 0
- debug = 0
script = None
- startup = 0
-
+ startup = False
try:
- opts, args = getopt.getopt(sys.argv[1:], "c:deir:st:")
+ opts, args = getopt.getopt(sys.argv[1:], "c:deihr: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
+ enable_shell = True
if o == '-d':
- debug = 1
+ debug = True
+ enable_shell = True
if o == '-e':
- edit = 1
+ enable_edit = True
+ if o == '-h':
+ sys.stdout.write(usage_msg)
+ sys.exit()
+ if o == '-i':
+ enable_shell = True
if o == '-r':
script = a
+ if os.path.isfile(script):
+ pass
+ else:
+ print "No script file: ", script
+ sys.exit()
+ enable_shell = True
if o == '-s':
- startup = 1
+ startup = True
+ enable_shell = True
if o == '-t':
PyShell.shell_title = a
+ enable_shell = True
+ if args and args[0] == '-':
+ cmd = sys.stdin.read()
+ enable_shell = True
+
+ use_subprocess = True
- if args and args[0] != "-": edit = 1
-
+ # process sys.argv and sys.path:
for i in range(len(sys.path)):
sys.path[i] = os.path.abspath(sys.path[i])
-
- pathx = []
- if edit:
+ if args and args[0] == '-':
+ sys.argv = [''] + args[1:]
+ elif cmd:
+ sys.argv = ['-c'] + args
+ elif script:
+ sys.argv = [script] + args
+ elif args:
+ enable_edit = True
+ pathx = []
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
+ for dir in pathx:
+ dir = os.path.abspath(dir)
+ if not dir in sys.path:
+ sys.path.insert(0, dir)
+ # check the IDLE settings configuration (but command line overrides)
+ edit_start = idleConf.GetOption('main', 'General',
+ 'editor-on-startup', type='bool')
+ enable_edit = enable_edit or edit_start
+ enable_shell = enable_shell or not edit_start
+ # start editor and/or shell windows:
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 enable_edit:
+ if not (cmd or script):
+ for filename in args:
+ flist.open(filename)
+ if not args:
+ flist.new()
+ if enable_shell:
+ flist.open_shell()
+ elif enable_shell:
+ flist.pyshell = PyShell(flist)
+ flist.pyshell.begin()
+ shell = flist.pyshell
+ # handle remaining options:
+ if debug:
+ shell.open_debugger()
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()
+ shell.interp.execfile(filename)
+ if cmd or script:
+ shell.interp.runcommand("""if 1:
+ import sys as _sys
+ _sys.argv = %s
+ del _sys
+ \n""" % `sys.argv`)
+ if cmd:
+ shell.interp.execsource(cmd)
+ elif script:
+ shell.interp.execfile(script)
root.mainloop()
root.destroy()
+
def display_port_binding_error():
print """\
IDLE cannot run.