diff options
Diffstat (limited to 'Lib/idlelib')
-rw-r--r-- | Lib/idlelib/PyShell.py | 9 | ||||
-rw-r--r-- | Lib/idlelib/config-main.def | 1 | ||||
-rw-r--r-- | Lib/idlelib/run.py | 22 |
3 files changed, 24 insertions, 8 deletions
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py index ed353c9..a11eaa5 100644 --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -312,13 +312,14 @@ class ModifiedInterpreter(InteractiveInterpreter): InteractiveInterpreter.__init__(self, locals=locals) self.save_warnings_filters = None self.restarting = False + self.subprocess_arglist = self.build_subprocess_arglist() port = 8833 rpcclt = None rpcpid = None def spawn_subprocess(self): - args = self.build_subprocess_arglist() + args = self.subprocess_arglist self.rpcpid = os.spawnv(os.P_NOWAIT, args[0], args) def build_subprocess_arglist(self): @@ -326,10 +327,12 @@ class ModifiedInterpreter(InteractiveInterpreter): # Maybe IDLE is installed and is being accessed via sys.path, # or maybe it's not installed and the idle.py script is being # run from the IDLE source directory. + del_exitf = idleConf.GetOption('main', 'General', 'delete-exitfunc', + default=False, type='bool') if __name__ == 'idlelib.PyShell': - command = "__import__('idlelib.run').run.main()" + command = "__import__('idlelib.run').run.main(" + `del_exitf` +")" else: - command = "__import__('run').main()" + command = "__import__('run').main(" + `del_exitf` + ")" return [sys.executable] + w + ["-c", command, str(self.port)] def start_subprocess(self): diff --git a/Lib/idlelib/config-main.def b/Lib/idlelib/config-main.def index 1350d60..206c37f 100644 --- a/Lib/idlelib/config-main.def +++ b/Lib/idlelib/config-main.def @@ -43,6 +43,7 @@ editor-on-startup= 0 autosave= 0 print-command-posix=lpr %s print-command-win=start /min notepad /p %s +delete-exitfunc= 0 [EditorWindow] width= 80 diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index abc9969..7d7a6e8 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -24,7 +24,7 @@ import __main__ exit_now = False quitting = False -def main(): +def main(del_exitfunc=False): """Start the Python execution server in a subprocess In the Python subprocess, RPCServer is instantiated with handlerclass @@ -44,6 +44,8 @@ def main(): """ global exit_now global quitting + global no_exitfunc + no_exitfunc = del_exitfunc port = 8833 if sys.argv[1:]: port = int(sys.argv[1]) @@ -57,7 +59,7 @@ def main(): try: if exit_now: try: - sys.exit(0) + exit() except KeyboardInterrupt: # exiting but got an extra KBI? Try again! continue @@ -83,7 +85,7 @@ def main(): except: # Link didn't work, print same exception to __stderr__ traceback.print_exception(type, value, tb, file=sys.__stderr__) - sys.exit(0) + exit() else: continue @@ -159,6 +161,16 @@ def flush_stdout(): except (AttributeError, EOFError): pass +def exit(): + """Exit subprocess, possibly after first deleting sys.exitfunc + + If config-main.cfg/.def 'General' 'delete-exitfunc' is True, then any + sys.exitfunc will be removed before exiting. (VPython support) + + """ + if no_exitfunc: + del sys.exitfunc + sys.exit(0) class MyRPCServer(rpc.RPCServer): @@ -186,7 +198,7 @@ class MyRPCServer(rpc.RPCServer): traceback.print_exc(file=erf) print>>erf, '\n*** Unrecoverable, server exiting!' print>>erf, '-'*40 - sys.exit(0) + exit() class MyHandler(rpc.RPCHandler): @@ -229,7 +241,7 @@ class Executive: exec code in self.locals except: if quitting: - sys.exit(0) + exit() # even print a user code SystemExit exception, continue print_exception() else: |