PyShell.py revision 63857a454d85fda475264575b7c1a031970219a0
17aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#! /usr/bin/env python 27aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 37aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport os 47aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport sys 57aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport string 67aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport getopt 77aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport re 85d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyimport socket 95d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyimport time 1094bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiserimport warnings 115d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyimport traceback 127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport linecache 147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererfrom code import InteractiveInterpreter 157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 167aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererfrom Tkinter import * 177aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport tkMessageBox 187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererfrom EditorWindow import EditorWindow, fixwordbreaks 207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererfrom FileList import FileList 217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererfrom ColorDelegator import ColorDelegator 227aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererfrom UndoDelegator import UndoDelegator 23969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiserfrom OutputWindow import OutputWindow 249930061ce28b1fc60d267ae3474c74a41e655cd5Steven M. Gavafrom configHandler import idleConf 257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport idlever 267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 275d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyimport rpc 28ffd3a4217a557bad4984621c22f5ae312d708169Kurt B. Kaiserimport RemoteDebugger 295d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 30969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser# XX hardwire this for now, remove later KBK 09Jun02 31969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiseruse_subprocess = 1 # Set to 1 to spawn subprocess for command execution 325d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 335d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey# Change warnings module to write to sys.__stderr__ 345d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teytry: 355d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey import warnings 365d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyexcept ImportError: 375d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey pass 385d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyelse: 395d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey def idle_showwarning(message, category, filename, lineno): 405d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey file = sys.__stderr__ 415d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey file.write(warnings.formatwarning(message, category, filename, lineno)) 425d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey warnings.showwarning = idle_showwarning 435d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 447aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer# We need to patch linecache.checkcache, because we don't want it 457aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer# to throw away our <pyshell#...> entries. 467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer# Rather than repeating its code here, we save those entries, 477aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer# then call the original function, and then restore the saved entries. 487aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererdef linecache_checkcache(orig_checkcache=linecache.checkcache): 497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer cache = linecache.cache 507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer save = {} 517aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer for filename in cache.keys(): 527aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if filename[:1] + filename[-1:] == '<>': 537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer save[filename] = cache[filename] 547aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer orig_checkcache() 557aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer cache.update(save) 567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererlinecache.checkcache = linecache_checkcache 577aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer# Note: <<newline-and-indent>> event is defined in AutoIndent.py 607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ event <<plain-newline-and-indent>> 627aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ win <Control-j> 637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ unix <Control-j> 647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ event <<beginning-of-line>> 667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ win <Control-a> 677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ win <Home> 687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ unix <Control-a> 697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ unix <Home> 707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ event <<history-next>> 727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ win <Alt-n> 737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ unix <Alt-n> 747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ event <<history-previous>> 767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ win <Alt-p> 777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ unix <Alt-p> 787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ event <<interrupt-execution>> 807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ win <Control-c> 817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ unix <Control-c> 827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ event <<end-of-file>> 847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ win <Control-d> 857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ unix <Control-d> 867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ event <<open-stack-viewer>> 887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#$ event <<toggle-debugger>> 907aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 917aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass PyShellEditorWindow(EditorWindow): 93ffd3a4217a557bad4984621c22f5ae312d708169Kurt B. Kaiser "Regular text edit window when a shell is present" 947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # XXX ought to merge with regular editor window 957aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def __init__(self, *args): 977aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer apply(EditorWindow.__init__, (self,) + args) 987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.bind("<<set-breakpoint-here>>", self.set_breakpoint_here) 99669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser self.text.bind("<<clear-breakpoint-here>>", 100669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser self.clear_breakpoint_here) 1017aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.bind("<<open-python-shell>>", self.flist.open_shell) 1027aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1037aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer rmenu_specs = [ 104669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser ("Set Breakpoint", "<<set-breakpoint-here>>"), 105669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser ("Clear Breakpoint", "<<clear-breakpoint-here>>") 1067aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ] 1077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1087aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def set_breakpoint_here(self, event=None): 1097aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if not self.flist.pyshell or not self.flist.pyshell.interp.debugger: 1107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.bell() 1117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return 1127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.flist.pyshell.interp.debugger.set_breakpoint_here(self) 1137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 114669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser def clear_breakpoint_here(self, event=None): 115669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser if not self.flist.pyshell or not self.flist.pyshell.interp.debugger: 116669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser self.text.bell() 117669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser return 118669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser self.flist.pyshell.interp.debugger.clear_breakpoint_here(self) 119669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser 1207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass PyShellFileList(FileList): 12283118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend base class: file list when a shell is present" 1237aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1247aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer EditorWindow = PyShellEditorWindow 1257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pyshell = None 1277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def open_shell(self, event=None): 1297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.pyshell: 1307aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.pyshell.wakeup() 1317aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 1327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.pyshell = PyShell(self) 1337aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.pyshell.begin() 1347aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return self.pyshell 1357aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1367aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1377aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass ModifiedColorDelegator(ColorDelegator): 13883118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend base class: colorizer for the shell window itself" 139b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava 140b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava def __init__(self): 141b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava ColorDelegator.__init__(self) 142b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava self.LoadTagDefs() 1437aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1447aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def recolorize_main(self): 1457aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tag_remove("TODO", "1.0", "iomark") 1467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tag_add("SYNC", "1.0", "iomark") 1477aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ColorDelegator.recolorize_main(self) 148b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava 149b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava def LoadTagDefs(self): 150b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava ColorDelegator.LoadTagDefs(self) 151b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava theme = idleConf.GetOption('main','Theme','name') 152b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava self.tagdefs.update({ 153b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava "stdin": {'background':None,'foreground':None}, 154b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava "stdout": idleConf.GetHighlight(theme, "stdout"), 155b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava "stderr": idleConf.GetHighlight(theme, "stderr"), 156b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava "console": idleConf.GetHighlight(theme, "console"), 157b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava "ERROR": idleConf.GetHighlight(theme, "error"), 158b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava None: idleConf.GetHighlight(theme, "normal"), 159b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava }) 1607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass ModifiedUndoDelegator(UndoDelegator): 16283118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend base class: forbid insert/delete before the I/O mark" 1637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def insert(self, index, chars, tags=None): 1657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 1667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.delegate.compare(index, "<", "iomark"): 1677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.delegate.bell() 1687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return 1697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except TclError: 1707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pass 1717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer UndoDelegator.insert(self, index, chars, tags) 1727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def delete(self, index1, index2=None): 1747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 1757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.delegate.compare(index1, "<", "iomark"): 1767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.delegate.bell() 1777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return 1787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except TclError: 1797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pass 1807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer UndoDelegator.delete(self, index1, index2) 1817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass ModifiedInterpreter(InteractiveInterpreter): 1837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def __init__(self, tkconsole): 1857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tkconsole = tkconsole 1867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer locals = sys.modules['__main__'].__dict__ 1877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer InteractiveInterpreter.__init__(self, locals=locals) 18894bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser self.save_warnings_filters = None 1897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 19063857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser port = 8833 1915d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey rpcclt = None 1925d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey rpcpid = None 1935d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 1945d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey def spawn_subprocess(self): 1955d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey w = ['-W' + s for s in sys.warnoptions] 1965d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey args = [sys.executable] + w + ["-c", "__import__('run').main()", 19763857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser str(self.port)] 1985d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.rpcpid = os.spawnv(os.P_NOWAIT, args[0], args) 19963857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser 20063857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser def start_subprocess(self): 20163857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser addr = ("localhost", self.port) 20263857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser self.spawn_subprocess() 2038dcdb77132563c734c228e815498c47e487f95cfKurt B. Kaiser # Idle starts listening for connection on localhost 2048dcdb77132563c734c228e815498c47e487f95cfKurt B. Kaiser for i in range(6): 2055d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey time.sleep(i) 2065d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey try: 2075d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.rpcclt = rpc.RPCClient(addr) 2085d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey break 2095d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey except socket.error, err: 2108dcdb77132563c734c228e815498c47e487f95cfKurt B. Kaiser if i < 3: 211b417936d4080004b6a7811fb411c6f77db4cc262Kurt B. Kaiser print>>sys.__stderr__, ". ", 212b417936d4080004b6a7811fb411c6f77db4cc262Kurt B. Kaiser else: 213b417936d4080004b6a7811fb411c6f77db4cc262Kurt B. Kaiser print>>sys.__stderr__,"\nIdle socket error: " + err[1]\ 214b417936d4080004b6a7811fb411c6f77db4cc262Kurt B. Kaiser + ", retrying..." 2155d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey else: 216969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser display_port_binding_error() 2175d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return 218b417936d4080004b6a7811fb411c6f77db4cc262Kurt B. Kaiser # Accept the connection from the Python execution server 219b417936d4080004b6a7811fb411c6f77db4cc262Kurt B. Kaiser self.rpcclt.accept() 220969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser self.rpcclt.register("stdin", self.tkconsole) 221969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser self.rpcclt.register("stdout", self.tkconsole.stdout) 222969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser self.rpcclt.register("stderr", self.tkconsole.stderr) 2235d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.rpcclt.register("flist", self.tkconsole.flist) 2245d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.poll_subprocess() 2255d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 22663857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser def restart_subprocess(self): 22763857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser # close only the subprocess debugger 22863857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser db = self.getdebugger() 22963857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser if db: 23063857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser RemoteDebugger.close_subprocess_debugger(self.rpcclt) 23163857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser # kill subprocess, spawn a new one, accept connection 23263857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser self.rpcclt.close() 23363857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser self.spawn_subprocess() 23463857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser self.rpcclt.accept() 23563857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser # restart remote debugger 23663857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser if db: 23763857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser gui = RemoteDebugger.restart_subprocess_debugger(self.rpcclt) 23863857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser # reload remote debugger breakpoints 23963857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser pass # XXX KBK 04Sep02 TBD 24063857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser 2415d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey active_seq = None 2425d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 2435d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey def poll_subprocess(self): 2445d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey clt = self.rpcclt 2455d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if clt is None: 2465d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return 2475d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey response = clt.pollresponse(self.active_seq) 2485d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.tkconsole.text.after(50, self.poll_subprocess) 2495d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if response: 2505d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.tkconsole.resetoutput() 2515d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.active_seq = None 2525d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey how, what = response 2535d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey file = self.tkconsole.console 2545d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if how == "OK": 2555d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if what is not None: 2565d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey print >>file, `what` 2575d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey elif how == "EXCEPTION": 2585d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey mod, name, args, tb = what 2595d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey print >>file, 'Traceback (most recent call last):' 2605d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey while tb and tb[0][0] in ("run.py", "rpc.py"): 2615d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey del tb[0] 2625d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey while tb and tb[-1][0] in ("run.py", "rpc.py"): 2635d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey del tb[-1] 2645d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey for i in range(len(tb)): 2655d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey fn, ln, nm, line = tb[i] 2665d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if not line and fn.startswith("<pyshell#"): 2675d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey line = linecache.getline(fn, ln) 2685d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey tb[i] = fn, ln, nm, line 2695d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey traceback.print_list(tb, file=file) 2705d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if mod and mod != "exceptions": 2715d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey name = mod + "." + name 2725d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey print >>file, name + ":", " ".join(map(str, args)) 2735d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.tkconsole.getvar("<<toggle-jit-stack-viewer>>"): 2745d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.remote_stack_viewer() 2755d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey elif how == "ERROR": 2765d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey print >>sys.__stderr__, "Oops:", how, what 2775d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey print >>file, "Oops:", how, what 2785d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.tkconsole.endexecuting() 2795d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 2805d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey def kill_subprocess(self): 2815d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey clt = self.rpcclt 2825d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.rpcclt = None 2835d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if clt is not None: 2845d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey clt.close() 2855d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 2865d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey def remote_stack_viewer(self): 2875d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey import RemoteObjectBrowser 2885d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey oid = self.rpcclt.remotecall("exec", "stackviewer", ("flist",), {}) 2895d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if oid is None: 2905d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.tkconsole.root.bell() 2915d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return 2925d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey item = RemoteObjectBrowser.StubObjectTreeItem(self.rpcclt, oid) 2935d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey from TreeWidget import ScrolledCanvas, TreeNode 2945d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey top = Toplevel(self.tkconsole.root) 2955d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey sc = ScrolledCanvas(top, bg="white", highlightthickness=0) 2965d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey sc.frame.pack(expand=1, fill="both") 2975d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey node = TreeNode(sc.canvas, None, item) 2985d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey node.expand() 2995d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey # XXX Should GC the remote tree when closing the window 3005d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 3017aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer gid = 0 3027aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3037aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def execsource(self, source): 30483118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Like runsource() but assumes complete exec source" 3057aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer filename = self.stuffsource(source) 3067aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.execfile(filename, source) 3077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3087aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def execfile(self, filename, source=None): 30983118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Execute an existing file" 3107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if source is None: 3117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer source = open(filename, "r").read() 3127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 3137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer code = compile(source, filename, "exec") 3147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except (OverflowError, SyntaxError): 3157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tkconsole.resetoutput() 3167aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer InteractiveInterpreter.showsyntaxerror(self, filename) 3177aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 3187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.runcode(code) 3197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def runsource(self, source): 32183118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend base class method: Stuff the source in the line cache first" 3227aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer filename = self.stuffsource(source) 3237aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.more = 0 32494bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser self.save_warnings_filters = warnings.filters[:] 32594bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser warnings.filterwarnings(action="error", category=SyntaxWarning) 32694bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser try: 32794bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser return InteractiveInterpreter.runsource(self, source, filename) 32894bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser finally: 32994bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser if self.save_warnings_filters is not None: 33094bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser warnings.filters[:] = self.save_warnings_filters 33194bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser self.save_warnings_filters = None 3327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3337aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def stuffsource(self, source): 33483118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Stuff source in the filename cache" 3357aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer filename = "<pyshell#%d>" % self.gid 3367aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.gid = self.gid + 1 3377aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer lines = string.split(source, "\n") 3387aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer linecache.cache[filename] = len(source)+1, 0, lines, filename 3397aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return filename 3407aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3417aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def showsyntaxerror(self, filename=None): 34283118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser """Extend base class method: Add Colorizing 34383118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser 34483118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser Color the offending position instead of printing it and pointing at it 34583118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser with a caret. 34683118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser 34783118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser """ 3487aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text = self.tkconsole.text 3497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer stuff = self.unpackerror() 3507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if not stuff: 3517aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tkconsole.resetoutput() 3527aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer InteractiveInterpreter.showsyntaxerror(self, filename) 3537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return 3547aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer msg, lineno, offset, line = stuff 3557aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if lineno == 1: 3567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pos = "iomark + %d chars" % (offset-1) 3577aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 3587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pos = "iomark linestart + %d lines + %d chars" % (lineno-1, 3597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer offset-1) 3607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.tag_add("ERROR", pos) 3617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.see(pos) 3627aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer char = text.get(pos) 3637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if char and char in string.letters + string.digits + "_": 3647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.tag_add("ERROR", pos + " wordstart", pos) 3657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tkconsole.resetoutput() 3667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.write("SyntaxError: %s\n" % str(msg)) 3677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def unpackerror(self): 3697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer type, value, tb = sys.exc_info() 3707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ok = type is SyntaxError 3717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if ok: 3727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 3737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer msg, (dummy_filename, lineno, offset, line) = value 3747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except: 3757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ok = 0 3767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if ok: 3777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return msg, lineno, offset, line 3787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 3797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return None 3807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def showtraceback(self): 38283118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend base class method to reset output properly" 3837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tkconsole.resetoutput() 3847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.checklinecache() 3857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer InteractiveInterpreter.showtraceback(self) 3865d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.tkconsole.getvar("<<toggle-jit-stack-viewer>>"): 3875d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.tkconsole.open_stack_viewer() 3887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def checklinecache(self): 3907aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer c = linecache.cache 3917aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer for key in c.keys(): 3927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if key[:1] + key[-1:] != "<>": 3937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer del c[key] 3947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3957aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer debugger = None 3967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3977aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def setdebugger(self, debugger): 3987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.debugger = debugger 3997aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 4007aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def getdebugger(self): 4017aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return self.debugger 4027aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 40363857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser def display_executing_dialog(self): 40463857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser tkMessageBox.showerror( 40563857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser "Already executing", 40663857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser "The Python Shell window is already executing a command; " 40763857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser "please wait until it is finished.", 40863857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser master=self.tkconsole.text) 40963857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser 4105d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey def runcommand(self, code): 41183118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Run the code without invoking the debugger" 4125d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey # The code better not raise an exception! 4135d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.tkconsole.executing: 41463857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser display_executing_dialog() 4155d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return 0 4165d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.rpcclt: 4175d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.rpcclt.remotecall("exec", "runcode", (code,), {}) 4185d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey else: 4195d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey exec code in self.locals 4205d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return 1 4215d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 4227aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def runcode(self, code): 42383118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Override base class method" 4245d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.tkconsole.executing: 42563857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser display_executing_dialog() 4265d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return 42783118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser # 4285d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.checklinecache() 42994bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser if self.save_warnings_filters is not None: 43094bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser warnings.filters[:] = self.save_warnings_filters 43194bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser self.save_warnings_filters = None 4327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer debugger = self.debugger 4335d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if not debugger and self.rpcclt is not None: 4345d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.tkconsole.beginexecuting() 4355d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.active_seq = self.rpcclt.asynccall("exec", "runcode", 4365d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey (code,), {}) 4375d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return 43883118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser # 4397aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 4407aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tkconsole.beginexecuting() 4417aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 4427aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if debugger: 4437aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer debugger.run(code, self.locals) 4447aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 4457aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer exec code in self.locals 4467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except SystemExit: 4477aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if tkMessageBox.askyesno( 4487aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer "Exit?", 4497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer "Do you want to exit altogether?", 4507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer default="yes", 4517aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer master=self.tkconsole.text): 4527aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer raise 4537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 4547aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.showtraceback() 4557aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except: 4567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.showtraceback() 45783118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser # 4587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer finally: 4597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tkconsole.endexecuting() 4607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 4617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def write(self, s): 46283118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Override base class method" 4637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tkconsole.console.write(s) 4647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 4657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass PyShell(OutputWindow): 4667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 4677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer shell_title = "Python Shell" 4687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 4697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Override classes 4707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ColorDelegator = ModifiedColorDelegator 4717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer UndoDelegator = ModifiedUndoDelegator 4727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 473dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser # Override menus: Run and Format not desired in shell; add Debug 474dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser menu_specs = [ 475dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser ("file", "_File"), 476dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser ("edit", "_Edit"), 477dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser ("debug", "_Debug"), 478dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser ("settings", "_Settings"), 479dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser ("windows", "_Windows"), 480dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser ("help", "_Help"), 481dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser ] 4827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 4837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # New classes 4847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer from IdleHistory import History 4857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 4867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def __init__(self, flist=None): 4877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.interp = ModifiedInterpreter(self) 4887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if flist is None: 4897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer root = Tk() 4907aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer fixwordbreaks(root) 4917aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer root.withdraw() 4927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer flist = PyShellFileList(root) 4937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 4947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer OutputWindow.__init__(self, flist, None, None) 4957aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 4967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer import __builtin__ 4977aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer __builtin__.quit = __builtin__.exit = "To exit, type Ctrl-D." 4987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 4997aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.auto = self.extensions["AutoIndent"] # Required extension 5007aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.auto.config(usetabs=1, indentwidth=8, context_use_ps1=1) 5017aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5027aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text = self.text 5037aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.configure(wrap="char") 5047aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<newline-and-indent>>", self.enter_callback) 5057aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<plain-newline-and-indent>>", self.linefeed_callback) 5067aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<interrupt-execution>>", self.cancel_callback) 5077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<beginning-of-line>>", self.home_callback) 5087aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<end-of-file>>", self.eof_callback) 5097aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<open-stack-viewer>>", self.open_stack_viewer) 5107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<toggle-debugger>>", self.toggle_debugger) 5117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<open-python-shell>>", self.flist.open_shell) 5127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<toggle-jit-stack-viewer>>", self.toggle_jit_stack_viewer) 5137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.save_stdout = sys.stdout 5157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.save_stderr = sys.stderr 5167aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.save_stdin = sys.stdin 5175d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.stdout = PseudoFile(self, "stdout") 5185d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.stderr = PseudoFile(self, "stderr") 5197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.console = PseudoFile(self, "console") 5205d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if not use_subprocess: 5215d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey sys.stdout = self.stdout 5225d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey sys.stderr = self.stderr 5235d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey sys.stdin = self 5247aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.history = self.History(self.text) 5267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5275d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if use_subprocess: 52863857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser self.interp.start_subprocess() 5295d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 5307aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer reading = 0 5317aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer executing = 0 5327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer canceled = 0 5337aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer endoffile = 0 5347aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5357aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def toggle_debugger(self, event=None): 5367aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.executing: 5377aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer tkMessageBox.showerror("Don't debug now", 5387aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer "You can only toggle the debugger when idle", 5397aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer master=self.text) 5407aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.set_debugger_indicator() 5417aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 5427aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 5437aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer db = self.interp.getdebugger() 5447aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if db: 5457aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.close_debugger() 5467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 5477aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.open_debugger() 5487aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def set_debugger_indicator(self): 5507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer db = self.interp.getdebugger() 5517aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.setvar("<<toggle-debugger>>", not not db) 5527aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def toggle_jit_stack_viewer( self, event=None): 5547aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pass # All we need is the variable 5557aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def close_debugger(self): 5577aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer db = self.interp.getdebugger() 5587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if db: 5597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.interp.setdebugger(None) 5607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer db.close() 561ffd3a4217a557bad4984621c22f5ae312d708169Kurt B. Kaiser if self.interp.rpcclt: 562ffd3a4217a557bad4984621c22f5ae312d708169Kurt B. Kaiser RemoteDebugger.close_remote_debugger(self.interp.rpcclt) 5637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 5647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.console.write("[DEBUG OFF]\n") 5657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.ps1 = ">>> " 5667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.showprompt() 5677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.set_debugger_indicator() 5687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def open_debugger(self): 5700e3a57731b4b1ffbfae151cf23289bbd51148163Kurt B. Kaiser # XXX KBK 13Jun02 An RPC client always exists now? Open remote 5710e3a57731b4b1ffbfae151cf23289bbd51148163Kurt B. Kaiser # debugger and return...dike the rest of this fcn and combine 5720e3a57731b4b1ffbfae151cf23289bbd51148163Kurt B. Kaiser # with open_remote_debugger? 5735d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.interp.rpcclt: 5745d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return self.open_remote_debugger() 5757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer import Debugger 5767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.interp.setdebugger(Debugger.Debugger(self)) 5777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.ps1 = "[DEBUG ON]\n>>> " 5787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.showprompt() 5797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.set_debugger_indicator() 5807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5815d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey def open_remote_debugger(self): 5825d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey gui = RemoteDebugger.start_remote_debugger(self.interp.rpcclt, self) 5835d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.interp.setdebugger(gui) 5845d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey sys.ps1 = "[DEBUG ON]\n>>> " 5855d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.showprompt() 5865d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.set_debugger_indicator() 5875d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 5887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def beginexecuting(self): 589ffd3a4217a557bad4984621c22f5ae312d708169Kurt B. Kaiser "Helper for ModifiedInterpreter" 5907aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 5917aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.executing = 1 5927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ##self._cancel_check = self.cancel_check 5937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ##sys.settrace(self._cancel_check) 5947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5957aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def endexecuting(self): 59683118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Helper for ModifiedInterpreter" 5977aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ##sys.settrace(None) 5987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ##self._cancel_check = None 5997aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.executing = 0 6007aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.canceled = 0 6015d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.showprompt() 6027aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6037aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def close(self): 60483118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend EditorWindow.close()" 6057aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.executing: 6067aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # XXX Need to ask a question here 6077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if not tkMessageBox.askokcancel( 6087aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer "Kill?", 6097aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer "The program is still running; do you want to kill it?", 6107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer default="ok", 6117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer master=self.text): 6127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "cancel" 6137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.canceled = 1 6147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.reading: 6157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.top.quit() 6167aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "cancel" 61783118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser return EditorWindow.close(self) 6187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def _close(self): 62083118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend EditorWindow._close(), shut down debugger and execution server" 6217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.close_debugger() 6225d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.interp.kill_subprocess() 6237aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Restore std streams 6247aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.stdout = self.save_stdout 6257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.stderr = self.save_stderr 6267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.stdin = self.save_stdin 6277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Break cycles 6287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.interp = None 6297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.console = None 6307aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.auto = None 6317aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.flist.pyshell = None 6327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.history = None 63383118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser EditorWindow._close(self) 6347aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6357aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def ispythonsource(self, filename): 63683118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Override EditorWindow method: never remove the colorizer" 6377aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return 1 6387aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6397aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def short_title(self): 6407aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return self.shell_title 6417aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 64294bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser COPYRIGHT = \ 64394bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser 'Type "copyright", "credits" or "license" for more information.' 64494bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser 6457aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def begin(self): 6467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 647969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser self.write("Python %s on %s\n%s\nGRPC IDLE Fork %s\n" % 64894bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser (sys.version, sys.platform, self.COPYRIGHT, 6497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer idlever.IDLE_VERSION)) 6507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 6517aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.ps1 6527aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except AttributeError: 6537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.ps1 = ">>> " 6547aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.showprompt() 6557aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer import Tkinter 6567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer Tkinter._default_root = None 6577aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def interact(self): 6597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.begin() 6607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.top.mainloop() 6617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6627aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def readline(self): 6637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer save = self.reading 6647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 6657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.reading = 1 6667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.top.mainloop() 6677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer finally: 6687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.reading = save 6697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer line = self.text.get("iomark", "end-1c") 6707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 6717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.canceled: 6727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.canceled = 0 6737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer raise KeyboardInterrupt 6747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.endoffile: 6757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.endoffile = 0 6767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "" 6777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return line 6787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def isatty(self): 6807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return 1 6817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def cancel_callback(self, event): 6837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 6847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.text.compare("sel.first", "!=", "sel.last"): 6857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return # Active selection -- always use default binding 6867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except: 6877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pass 6887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if not (self.executing or self.reading): 6897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 6907aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.write("KeyboardInterrupt\n") 6917aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.showprompt() 6927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 6937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.endoffile = 0 6947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.reading: 6955d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.canceled = 1 6967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.top.quit() 6975d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey elif (self.executing and self.interp.rpcclt and 6985d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.interp.rpcpid and hasattr(os, "kill")): 6995d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey try: 7005d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey from signal import SIGINT 7015d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey except ImportError: 7025d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey SIGINT = 2 7035d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey os.kill(self.interp.rpcpid, SIGINT) 7045d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey else: 7055d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.canceled = 1 7067aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 7077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 7087aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def eof_callback(self, event): 7097aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.executing and not self.reading: 7107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return # Let the default binding (delete next char) take over 7117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if not (self.text.compare("iomark", "==", "insert") and 7127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.compare("insert", "==", "end-1c")): 7137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return # Let the default binding (delete next char) take over 7147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if not self.executing: 7157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 7167aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.close() 7177aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 7187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.canceled = 0 7197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.endoffile = 1 7207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.top.quit() 7217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 7227aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 7237aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def home_callback(self, event): 7247aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if event.state != 0 and event.keysym == "Home": 7257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return # <Modifier-Home>; fall back to class binding 7267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.text.compare("iomark", "<=", "insert") and \ 7277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.compare("insert linestart", "<=", "iomark"): 7287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.mark_set("insert", "iomark") 7297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.tag_remove("sel", "1.0", "end") 7307aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.see("insert") 7317aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 7327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 7337aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def linefeed_callback(self, event): 7347aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Insert a linefeed without entering anything (still autoindented) 7357aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.reading: 7367aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.insert("insert", "\n") 7377aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.see("insert") 7387aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 7397aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.auto.auto_indent(event) 7407aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 7417aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 7427aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def enter_callback(self, event): 7437aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.executing and not self.reading: 7447aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return # Let the default binding (insert '\n') take over 7457aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # If some text is selected, recall the selection 7467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # (but only if this before the I/O mark) 7477aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 7487aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sel = self.text.get("sel.first", "sel.last") 7497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if sel: 7507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.text.compare("sel.last", "<=", "iomark"): 7517aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.recall(sel) 7527aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 7537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except: 7547aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pass 7557aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # If we're strictly before the line containing iomark, recall 7567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # the current line, less a leading prompt, less leading or 7577aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # trailing whitespace 7587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.text.compare("insert", "<", "iomark linestart"): 7597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Check if there's a relevant stdin range -- if so, use it 7607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer prev = self.text.tag_prevrange("stdin", "insert") 7617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if prev and self.text.compare("insert", "<", prev[1]): 7627aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.recall(self.text.get(prev[0], prev[1])) 7637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 7647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer next = self.text.tag_nextrange("stdin", "insert") 7657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if next and self.text.compare("insert lineend", ">=", next[0]): 7667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.recall(self.text.get(next[0], next[1])) 7677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 7687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # No stdin mark -- just get the current line 7697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.recall(self.text.get("insert linestart", "insert lineend")) 7707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 7717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # If we're in the current input and there's only whitespace 7727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # beyond the cursor, erase that whitespace first 7737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer s = self.text.get("insert", "end-1c") 7747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if s and not string.strip(s): 7757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.delete("insert", "end-1c") 7767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # If we're in the current input before its last line, 7777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # insert a newline right at the insert point 7787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.text.compare("insert", "<", "end-1c linestart"): 7797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.auto.auto_indent(event) 7807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 7817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # We're in the last line; append a newline and submit it 7827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.mark_set("insert", "end-1c") 7837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.reading: 7847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.insert("insert", "\n") 7857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.see("insert") 7867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 7877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.auto.auto_indent(event) 7887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.tag_add("stdin", "iomark", "end-1c") 7897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.update_idletasks() 7907aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.reading: 7917aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.top.quit() # Break out of recursive mainloop() in raw_input() 7927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 7937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.runit() 7947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 7957aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 7967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def recall(self, s): 7977aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.history: 7987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.history.recall(s) 7997aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8007aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def runit(self): 8017aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer line = self.text.get("iomark", "end-1c") 8027aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Strip off last newline and surrounding whitespace. 8037aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # (To allow you to hit return twice to end a statement.) 8047aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer i = len(line) 8057aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer while i > 0 and line[i-1] in " \t": 8067aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer i = i-1 8077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if i > 0 and line[i-1] == "\n": 8087aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer i = i-1 8097aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer while i > 0 and line[i-1] in " \t": 8107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer i = i-1 8117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer line = line[:i] 8127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer more = self.interp.runsource(line) 8137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def cancel_check(self, frame, what, args, 8157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer dooneevent=tkinter.dooneevent, 8167aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer dontwait=tkinter.DONT_WAIT): 8177aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Hack -- use the debugger hooks to be able to handle events 8187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # and interrupt execution at any time. 8197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # This slows execution down quite a bit, so you may want to 8207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # disable this (by not calling settrace() in runcode() above) 8217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # for full-bore (uninterruptable) speed. 8227aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # XXX This should become a user option. 8237aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.canceled: 8247aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return 8257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer dooneevent(dontwait) 8267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.canceled: 8277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.canceled = 0 8287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer raise KeyboardInterrupt 8297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return self._cancel_check 8307aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8317aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def open_stack_viewer(self, event=None): 8325d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.interp.rpcclt: 8335d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return self.interp.remote_stack_viewer() 8347aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 8357aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.last_traceback 8367aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except: 8377aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer tkMessageBox.showerror("No stack trace", 8387aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer "There is no stack trace yet.\n" 8397aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer "(sys.last_traceback is not defined)", 8407aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer master=self.text) 8417aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return 8427aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer from StackViewer import StackBrowser 8437aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sv = StackBrowser(self.root, self.flist) 8447aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8457aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def showprompt(self): 8467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 8477aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 8487aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer s = str(sys.ps1) 8497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except: 8507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer s = "" 8517aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.console.write(s) 8527aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.mark_set("insert", "end-1c") 8535d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.set_line_and_column() 854dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser self.io.reset_undo() 8557aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def resetoutput(self): 8577aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer source = self.text.get("iomark", "end-1c") 8587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.history: 8597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.history.history_store(source) 8607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.text.get("end-2c") != "\n": 8617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.insert("end-1c", "\n") 8627aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.mark_set("iomark", "end-1c") 8635d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.set_line_and_column() 8647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.stdout.softspace = 0 8657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def write(self, s, tags=()): 8677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.mark_gravity("iomark", "right") 8687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer OutputWindow.write(self, s, tags, "iomark") 8697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.mark_gravity("iomark", "left") 8707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.canceled: 8717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.canceled = 0 8727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer raise KeyboardInterrupt 8737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass PseudoFile: 8757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def __init__(self, shell, tags): 8777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.shell = shell 8787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tags = tags 8795d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.softspace = 0 8807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def write(self, s): 8827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.shell.write(s, self.tags) 8837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def writelines(self, l): 8857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer map(self.write, l) 8867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def flush(self): 8887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pass 8897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8907aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def isatty(self): 8917aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return 1 8927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 893969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 8947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererusage_msg = """\ 89596d88422373ffb32aef75157647e0575a0471c03Kurt B. Kaiserusage: idle.py [-c command] [-d] [-i] [-r script] [-s] [-t title] [arg] ... 8967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 89796d88422373ffb32aef75157647e0575a0471c03Kurt B. Kaiseridle file(s) (without options) edit the file(s) 8987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 89996d88422373ffb32aef75157647e0575a0471c03Kurt B. Kaiser-c cmd run the command in a shell 90096d88422373ffb32aef75157647e0575a0471c03Kurt B. Kaiser-d enable the debugger 9015d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey-e edit mode; arguments are files to be edited 90296d88422373ffb32aef75157647e0575a0471c03Kurt B. Kaiser-i open an interactive shell 90396d88422373ffb32aef75157647e0575a0471c03Kurt B. Kaiser-i file(s) open a shell and also an editor window for each file 904969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser-r 90596d88422373ffb32aef75157647e0575a0471c03Kurt B. Kaiser-s run $IDLESTARTUP or $PYTHONSTARTUP before anything else 90696d88422373ffb32aef75157647e0575a0471c03Kurt B. Kaiser-t title set title of shell window 90796d88422373ffb32aef75157647e0575a0471c03Kurt B. Kaiser 90896d88422373ffb32aef75157647e0575a0471c03Kurt B. KaiserRemaining arguments are applied to the command (-c) or script (-r). 9097aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer""" 9107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 911969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiserdef main(): 912969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser cmd = None 913969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser edit = 0 914969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser debug = 0 915969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser script = None 916969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser startup = 0 917969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 918969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser try: 919969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser opts, args = getopt.getopt(sys.argv[1:], "c:deir:st:") 920969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser except getopt.error, msg: 921969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser sys.stderr.write("Error: %s\n" % str(msg)) 922969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser sys.stderr.write(usage_msg) 923969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser sys.exit(2) 924969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 925969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser for o, a in opts: 926969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if o == '-c': 927969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser cmd = a 928969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if o == '-d': 929969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser debug = 1 930969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if o == '-e': 931969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser edit = 1 932969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if o == '-r': 933969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser script = a 934969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if o == '-s': 935969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser startup = 1 936969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if o == '-t': 937969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser PyShell.shell_title = a 938969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 939969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if args and args[0] != "-": edit = 1 940969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 941969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser for i in range(len(sys.path)): 942969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser sys.path[i] = os.path.abspath(sys.path[i]) 943969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 944969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser pathx = [] 945969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if edit: 946969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser for filename in args: 947969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser pathx.append(os.path.dirname(filename)) 948969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser elif args and args[0] != "-": 949969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser pathx.append(os.path.dirname(args[0])) 950969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser else: 951969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser pathx.append(os.curdir) 952969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser for dir in pathx: 953969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser dir = os.path.abspath(dir) 954969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if not dir in sys.path: 955969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser sys.path.insert(0, dir) 956969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 957969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser global flist, root 958969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser root = Tk(className="Idle") 959969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser fixwordbreaks(root) 960969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser root.withdraw() 961969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser flist = PyShellFileList(root) 962969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 963969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if edit: 964969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser for filename in args: 965969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser flist.open(filename) 966969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if not args: 967969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser flist.new() 968969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser else: 969969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if cmd: 970969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser sys.argv = ["-c"] + args 971969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser else: 972969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser sys.argv = args or [""] 973969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 974969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser shell = PyShell(flist) 975969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser interp = shell.interp 976969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser flist.pyshell = shell 977969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 978969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if startup: 979969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser filename = os.environ.get("IDLESTARTUP") or \ 980969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser os.environ.get("PYTHONSTARTUP") 981969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if filename and os.path.isfile(filename): 982969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser interp.execfile(filename) 983969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 984969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if debug: 985969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser shell.open_debugger() 986969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if cmd: 987969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser interp.execsource(cmd) 988969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser elif script: 989969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if os.path.isfile(script): 990969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser interp.execfile(script) 991969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser else: 992969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser print "No script file: ", script 993969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser shell.begin() 994969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser root.mainloop() 995969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser root.destroy() 996969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 997969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiserdef display_port_binding_error(): 998969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser print """\ 9991f733baa04a56eed0a5823158205fc04502e3050Steven M. GavaIDLE cannot run. 10001f733baa04a56eed0a5823158205fc04502e3050Steven M. Gava 1001969de458aa12e831942637bbcd9994b29dc86252Kurt B. KaiserIDLE needs to use a specific TCP/IP port (8833) in order to execute and 10021f733baa04a56eed0a5823158205fc04502e3050Steven M. Gavadebug programs. IDLE is unable to bind to this port, and so cannot 10031f733baa04a56eed0a5823158205fc04502e3050Steven M. Gavastart. Here are some possible causes of this problem: 10041f733baa04a56eed0a5823158205fc04502e3050Steven M. Gava 10051f733baa04a56eed0a5823158205fc04502e3050Steven M. Gava 1. TCP/IP networking is not installed or not working on this computer 10061f733baa04a56eed0a5823158205fc04502e3050Steven M. Gava 2. Another program is running that uses this port 1007969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 3. Personal firewall software is preventing IDLE from using this port 10081f733baa04a56eed0a5823158205fc04502e3050Steven M. Gava 10091f733baa04a56eed0a5823158205fc04502e3050Steven M. GavaIDLE makes and accepts connections only with this computer, and does not 1010969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaisercommunicate over the internet in any way. Its use of port 8833 should not 10111f733baa04a56eed0a5823158205fc04502e3050Steven M. Gavabe a security risk on a single-user machine. 10121f733baa04a56eed0a5823158205fc04502e3050Steven M. Gava""" 10137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 10147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererif __name__ == "__main__": 10157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer main() 1016