[Idle-dev] Merging VIDLE differences into idlelib
Guilherme Polo
ggpolo at gmail.com
Tue Aug 4 15:25:07 CEST 2009
Hi there,
I have verified the VIDLE fork last week expecting to find many
differences between it and IDLE. Most files differ but it turned out
that most of these differences are equivalent (many of the changes
were merged already), except for two of them. One of these changes is
related to py2app, so I can't verify it. The second is about using the
subprocess module to spawn the subprocess, so it is easier to
terminate it properly under Windows (the original code was a bit
different since it was done before Python 2.6). I'm not a heavy
Windows so I can't tell how much this helps, my guess is that it would
help with http://bugs.python.org/issue2708.
Do anyone believe these changes could help IDLE ?
Index: Lib/idlelib/PyShell.py
===================================================================
--- Lib/idlelib/PyShell.py (revision 74191)
+++ Lib/idlelib/PyShell.py (working copy)
@@ -11,6 +11,7 @@
import threading
import traceback
import types
+import subprocess
import macosxSupport
import linecache
@@ -40,11 +41,6 @@
HOST = '127.0.0.1' # python execution server on localhost loopback
PORT = 0 # someday pass in host, port for remote debug capability
-try:
- from signal import SIGTERM
-except ImportError:
- SIGTERM = 15
-
# Override warnings module to write to warning_stream. Initialize to send IDLE
# internal warnings to the console. ScriptBinding.check_syntax() will
# temporarily redirect the stream to the shell window to display warnings when
@@ -347,13 +343,13 @@
self.port = PORT
rpcclt = None
- rpcpid = None
+ rpcproc = None
def spawn_subprocess(self):
- if self.subprocess_arglist == None:
+ if self.subprocess_arglist is None:
self.subprocess_arglist = self.build_subprocess_arglist()
args = self.subprocess_arglist
- self.rpcpid = os.spawnv(os.P_NOWAIT, sys.executable, args)
+ self.rpcproc = subprocess.Popen([sys.executable] + args[1:])
def build_subprocess_arglist(self):
assert (self.port!=0), (
@@ -433,7 +429,7 @@
pass
# Kill subprocess, spawn a new one, accept connection.
self.rpcclt.close()
- self.unix_terminate()
+ self.terminate_subprocess()
console = self.tkconsole
was_executing = console.executing
console.executing = False
@@ -474,23 +470,14 @@
self.rpcclt.close()
except AttributeError: # no socket
pass
- self.unix_terminate()
+ self.terminate_subprocess()
self.tkconsole.executing = False
self.rpcclt = None
- def unix_terminate(self):
- "UNIX: make sure subprocess is terminated and collect status"
- if hasattr(os, 'kill'):
- try:
- os.kill(self.rpcpid, SIGTERM)
- except OSError:
- # process already terminated:
- return
- else:
- try:
- os.waitpid(self.rpcpid, 0)
- except OSError:
- return
+ def terminate_subprocess(self):
+ "Make sure subprocess is terminated and collect status."
+ self.rpcproc.kill()
+ self.rpcproc.wait()
def transfer_path(self):
self.runcommand("""if 1:
@@ -1312,6 +1299,8 @@
def main():
global flist, root, use_subprocess
+ macosxSupport.preprocessArguments()
+
use_subprocess = True
enable_shell = True
enable_edit = False
Index: Lib/idlelib/macosxSupport.py
===================================================================
--- Lib/idlelib/macosxSupport.py (revision 74191)
+++ Lib/idlelib/macosxSupport.py (working copy)
@@ -9,7 +9,7 @@
"""
Returns True if Python is running from within an app on OSX.
If so, assume that Python was built with Aqua Tcl/Tk rather than
- X11 Tck/Tk.
+ X11 Tcl/Tk.
"""
return (sys.platform == 'darwin' and '.app' in sys.executable)
@@ -121,6 +121,13 @@
menu.add_command(label=label, underline=underline,
command=command, accelerator=accelerator)
+def preprocessArguments():
+ # Deal with spurious argument passed by Finder, so "argv emulation" is
+ # not required for app bundle
+ argv = sys.argv
+ if runningAsOSXApp() and len(argv) > 1 and argv[1].startswith("-psn"):
+ del sys.argv[1]
+
def setupApp(root, flist):
"""
Perform setup for the OSX application bundle.
--
-- Guilherme H. Polo Goncalves
More information about the IDLE-dev
mailing list