74 lines
2.7 KiB
Python
74 lines
2.7 KiB
Python
"""
|
|
Bootstrap script for IDLE as an application bundle.
|
|
"""
|
|
import sys, os
|
|
|
|
# Change the current directory the user's home directory, that way we'll get
|
|
# a more useful default location in the open/save dialogs.
|
|
os.chdir(os.path.expanduser('~/Documents'))
|
|
|
|
|
|
# Make sure sys.executable points to the python interpreter inside the
|
|
# framework, instead of at the helper executable inside the application
|
|
# bundle (the latter works, but doesn't allow access to the window server)
|
|
#
|
|
# .../IDLE.app/
|
|
# Contents/
|
|
# MacOS/
|
|
# IDLE (a python script)
|
|
# Python{-32} (symlink)
|
|
# Resources/
|
|
# idlemain.py (this module)
|
|
# ...
|
|
#
|
|
# ../IDLE.app/Contents/MacOS/Python{-32} is symlinked to
|
|
# ..Library/Frameworks/Python.framework/Versions/m.n
|
|
# /Resources/Python.app/Contents/MacOS/Python{-32}
|
|
# which is the Python interpreter executable
|
|
#
|
|
# The flow of control is as follows:
|
|
# 1. IDLE.app is launched which starts python running the IDLE script
|
|
# 2. IDLE script exports
|
|
# PYTHONEXECUTABLE = .../IDLE.app/Contents/MacOS/Python{-32}
|
|
# (the symlink to the framework python)
|
|
# 3. IDLE script alters sys.argv and uses os.execve to replace itself with
|
|
# idlemain.py running under the symlinked python.
|
|
# This is the magic step.
|
|
# 4. During interpreter initialization, because PYTHONEXECUTABLE is defined,
|
|
# sys.executable may get set to an unuseful value.
|
|
#
|
|
# (Note that the IDLE script and the setting of PYTHONEXECUTABLE is
|
|
# generated automatically by bundlebuilder in the Python 2.x build.
|
|
# Also, IDLE invoked via command line, i.e. bin/idle, bypasses all of
|
|
# this.)
|
|
#
|
|
# Now fix up the execution environment before importing idlelib.
|
|
|
|
# Reset sys.executable to its normal value, the actual path of
|
|
# the interpreter in the framework, by following the symlink
|
|
# exported in PYTHONEXECUTABLE.
|
|
pyex = os.environ['PYTHONEXECUTABLE']
|
|
sys.executable = os.path.join(os.path.dirname(pyex), os.readlink(pyex))
|
|
|
|
# Remove any sys.path entries for the Resources dir in the IDLE.app bundle.
|
|
p = pyex.partition('.app')
|
|
if p[2].startswith('/Contents/MacOS/Python'):
|
|
sys.path = [value for value in sys.path if
|
|
value.partition('.app') != (p[0], p[1], '/Contents/Resources')]
|
|
|
|
# Unexport PYTHONEXECUTABLE so that the other Python processes started
|
|
# by IDLE have a normal sys.executable.
|
|
del os.environ['PYTHONEXECUTABLE']
|
|
|
|
# Look for the -psn argument that the launcher adds and remove it, it will
|
|
# only confuse the IDLE startup code.
|
|
for idx, value in enumerate(sys.argv):
|
|
if value.startswith('-psn_'):
|
|
del sys.argv[idx]
|
|
break
|
|
|
|
# Now it is safe to import idlelib.
|
|
from idlelib.PyShell import main
|
|
if __name__ == '__main__':
|
|
main()
|