blob: d6803ba832c8e7a148e00a8f1ddbac78cb44a26c [file] [log] [blame]
Ronald Oussoren2db3a8f2006-06-07 19:06:01 +00001"""
2Bootstrap script for IDLE as an application bundle.
3"""
4import sys, os
5
Ronald Oussoren2db3a8f2006-06-07 19:06:01 +00006# Change the current directory the user's home directory, that way we'll get
7# a more useful default location in the open/save dialogs.
8os.chdir(os.path.expanduser('~/Documents'))
9
10
11# Make sure sys.executable points to the python interpreter inside the
12# framework, instead of at the helper executable inside the application
13# bundle (the latter works, but doesn't allow access to the window server)
Ronald Oussorende3dfc12009-03-04 21:35:38 +000014#
15# .../IDLE.app/
16# Contents/
17# MacOS/
18# IDLE (a python script)
19# Python{-32} (symlink)
20# Resources/
21# idlemain.py (this module)
22# ...
23#
24# ../IDLE.app/Contents/MacOS/Python{-32} is symlinked to
25# ..Library/Frameworks/Python.framework/Versions/m.n
26# /Resources/Python.app/Contents/MacOS/Python{-32}
27# which is the Python interpreter executable
28#
29# The flow of control is as follows:
30# 1. IDLE.app is launched which starts python running the IDLE script
31# 2. IDLE script exports
32# PYTHONEXECUTABLE = .../IDLE.app/Contents/MacOS/Python{-32}
33# (the symlink to the framework python)
34# 3. IDLE script alters sys.argv and uses os.execve to replace itself with
35# idlemain.py running under the symlinked python.
36# This is the magic step.
37# 4. During interpreter initialization, because PYTHONEXECUTABLE is defined,
38# sys.executable may get set to an unuseful value.
39#
40# (Note that the IDLE script and the setting of PYTHONEXECUTABLE is
41# generated automatically by bundlebuilder in the Python 2.x build.
42# Also, IDLE invoked via command line, i.e. bin/idle, bypasses all of
43# this.)
44#
45# Now fix up the execution environment before importing idlelib.
46
47# Reset sys.executable to its normal value, the actual path of
48# the interpreter in the framework, by following the symlink
49# exported in PYTHONEXECUTABLE.
50pyex = os.environ['PYTHONEXECUTABLE']
51sys.executable = os.path.join(os.path.dirname(pyex), os.readlink(pyex))
52
53# Remove any sys.path entries for the Resources dir in the IDLE.app bundle.
54p = pyex.partition('.app')
55if p[2].startswith('/Contents/MacOS/Python'):
56 sys.path = [value for value in sys.path if
57 value.partition('.app') != (p[0], p[1], '/Contents/Resources')]
58
59# Unexport PYTHONEXECUTABLE so that the other Python processes started
60# by IDLE have a normal sys.executable.
61del os.environ['PYTHONEXECUTABLE']
Ronald Oussoren2db3a8f2006-06-07 19:06:01 +000062
63# Look for the -psn argument that the launcher adds and remove it, it will
64# only confuse the IDLE startup code.
65for idx, value in enumerate(sys.argv):
66 if value.startswith('-psn_'):
67 del sys.argv[idx]
68 break
69
Ronald Oussorende3dfc12009-03-04 21:35:38 +000070# Now it is safe to import idlelib.
71from idlelib.PyShell import main
Ronald Oussoren2db3a8f2006-06-07 19:06:01 +000072if __name__ == '__main__':
73 main()