Added a config-main General option to delete sys.exitfunc.  The default
is not to do that.  VPython and student environment support.

M PyShell.py
M config-main.def
M run.py
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 @@
         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 @@
         # 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 @@
 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 @@
 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 @@
     """
     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 @@
         try:
             if exit_now:
                 try:
-                    sys.exit(0)
+                    exit()
                 except KeyboardInterrupt:
                     # exiting but got an extra KBI? Try again!
                     continue
@@ -83,7 +85,7 @@
             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 @@
     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 @@
             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 @@
             exec code in self.locals
         except:
             if quitting:
-                sys.exit(0)
+                exit()
             # even print a user code SystemExit exception, continue
             print_exception()
         else: