Kaydet (Commit) f53dec2e authored tarafından Tony Lownds's avatar Tony Lownds

Update way a subprocess is launched for Mac OS X.

Another applet mechanism has been developed for Python on Mac OS X and
trying to use the -c "__import__('run').main()" trick is just not working.

macosx_main.py is a new file which should be used as the startup file for
Mac OS X applet bundles. This startup file understands a -p option, which
when seen will start run.main(). When running as an applet, this seems like
the best approach.
üst 24475896
...@@ -298,24 +298,27 @@ class ModifiedInterpreter(InteractiveInterpreter): ...@@ -298,24 +298,27 @@ class ModifiedInterpreter(InteractiveInterpreter):
rpcpid = None rpcpid = None
def spawn_subprocess(self): def spawn_subprocess(self):
w = ['-W' + s for s in sys.warnoptions] args = self.build_subprocess_arglist()
args = [self.find_executable()] + w \
+ ["-c", "__import__('run').main()", str(self.port)]
self.rpcpid = os.spawnv(os.P_NOWAIT, args[0], args) self.rpcpid = os.spawnv(os.P_NOWAIT, args[0], args)
def find_executable(self): def build_subprocess_arglist(self):
if sys.platform == 'darwin' and sys.executable.count('.app'): if sys.platform == 'darwin' and sys.argv[0].count('.app'):
# On Mac OS X, avoid calling sys.executable because it ignores # We need to avoid using sys.executable because it fails on some
# command-line options (sys.executable is an applet) # of the applet architectures On Mac OS X.
#
# here are the applet architectures tried:
#
# framework applet: sys.executable + -p is correct
# python 2.2 + pure python main applet:
# sys.executable + -p is correct
# pythonw idle.py: sys.executable + -c is correct
# #
# Instead, find the executable by looking relative to # XXX what about warnoptions?
# sys.prefix. return [sys.executable, '-p', str(self.port)]
executable = os.path.join(sys.prefix, 'Resources',
'Python.app', 'Contents',
'MacOS', 'python')
return executable
else: else:
return sys.executable w = ['-W' + s for s in sys.warnoptions]
return [sys.executable] + w \
+ ["-c", "__import__('run').main()", str(self.port)]
def start_subprocess(self): def start_subprocess(self):
addr = ("localhost", self.port) addr = ("localhost", self.port)
...@@ -1174,6 +1177,7 @@ def main(): ...@@ -1174,6 +1177,7 @@ def main():
fixwordbreaks(root) fixwordbreaks(root)
root.withdraw() root.withdraw()
flist = PyShellFileList(root) flist = PyShellFileList(root)
if enable_edit: if enable_edit:
if not (cmd or script): if not (cmd or script):
for filename in args: for filename in args:
......
"boolcheck - import this module to ensure True, False, bool() builtins exist."
try:
True
except NameError:
import __builtin__
__builtin__.True = 1
__builtin__.False = 0
from operator import truth
__builtin__.bool = truth
#! /usr/bin/env python #! /usr/bin/env python
import PyShell # Add IDLE.app/Contents/Resources/idlelib to path.
PyShell.main() # __file__ refers to this file when it is used as a module, sys.argv[0]
# refers to this file when it is used as a script (pythonw macosx_main.py)
import sys
from os.path import split, join
try:
__file__
except NameError:
__file__ = sys.argv[0]
idlelib = join(split(__file__)[0], 'idlelib')
if os.path.isdir(idlelib):
sys.path.append(idlelib)
# Make sure True, False, bool() builtins exist.
# - preserves 2.2 compatibility - 2.2.1 includes bool, 2.2 does not.
# - important for Mac OS X because it ships python 2.2
import boolcheck
# see if we are being asked to execute the subprocess code
if '-p' in sys.argv:
# run expects only the port number in sys.argv
sys.argv.remove('-p')
# this module will become the namepsace used by the interactive
# interpreter; remove all variables we have defined.
del sys, __file__, boolcheck, split, join
__import__('run').main()
else:
# start the application.
import PyShell
PyShell.main()
"""IDLE.app
Installation:
see the install_IDLE target in python/dist/src/Mac/OSX/Makefile
Usage:
1. Double clicking IDLE icon will open IDLE.
2. Dropping file on IDLE icon will open that file in IDLE.
3. Launch from command line with files with this command-line:
/Applications/Python/IDLE.app/Contents/MacOS/python file1 file2 file3
"""
# Add IDLE.app/Contents/Resources/idlelib to path.
# __file__ refers to this file when it is used as a module, sys.argv[0]
# refers to this file when it is used as a script (pythonw macosx_main.py)
import sys
from os.path import split, join, isdir
try:
__file__
except NameError:
__file__ = sys.argv[0]
idlelib = join(split(__file__)[0], 'idlelib')
if isdir(idlelib):
sys.path.append(idlelib)
# Make sure True, False, bool() builtins exist.
# - preserves 2.2 compatibility - 2.2.1 includes bool, 2.2 does not.
# - important for Mac OS X because it ships python 2.2
import boolcheck
# see if we are being asked to execute the subprocess code
if '-p' in sys.argv:
# run expects only the port number in sys.argv
sys.argv.remove('-p')
# this module will become the namepsace used by the interactive
# interpreter; remove all variables we have defined.
del sys, __file__, boolcheck, split, join
__import__('run').main()
else:
# Load idlelib/idle.py which starts the application.
import idle
...@@ -2,6 +2,8 @@ import sys ...@@ -2,6 +2,8 @@ import sys
import time import time
import socket import socket
import boolcheck
import CallTips import CallTips
import RemoteDebugger import RemoteDebugger
import RemoteObjectBrowser import RemoteObjectBrowser
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment