summaryrefslogtreecommitdiffstats
path: root/Mac/IDLE
diff options
context:
space:
mode:
authorRonald Oussoren <ronaldoussoren@mac.com>2009-02-12 15:01:44 (GMT)
committerRonald Oussoren <ronaldoussoren@mac.com>2009-02-12 15:01:44 (GMT)
commit827822ef3f389548ca2ac11b11c5e498f45fe78a (patch)
tree94532be2aa8126ef966cff4f1f7c0d7d35871b37 /Mac/IDLE
parentde09acf2984b6699aa7a45c2ea2429c6da5f046e (diff)
downloadcpython-827822ef3f389548ca2ac11b11c5e498f45fe78a.zip
cpython-827822ef3f389548ca2ac11b11c5e498f45fe78a.tar.gz
cpython-827822ef3f389548ca2ac11b11c5e498f45fe78a.tar.bz2
Fix for issue5194, based on a patch by Ned Deily.
Diffstat (limited to 'Mac/IDLE')
-rwxr-xr-xMac/IDLE/IDLE.app/Contents/MacOS/IDLE2
-rw-r--r--Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py57
2 files changed, 51 insertions, 8 deletions
diff --git a/Mac/IDLE/IDLE.app/Contents/MacOS/IDLE b/Mac/IDLE/IDLE.app/Contents/MacOS/IDLE
index ecf29bf..61b02ff 100755
--- a/Mac/IDLE/IDLE.app/Contents/MacOS/IDLE
+++ b/Mac/IDLE/IDLE.app/Contents/MacOS/IDLE
@@ -1,4 +1,4 @@
-#!%prefix%/Resources/Python.app/Contents/MacOS/Python3
+#!%prefix%/Resources/Python.app/Contents/MacOS/%exe%
import sys, os
execdir = os.path.dirname(sys.argv[0])
diff --git a/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py b/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py
index 9b52738..d6803ba 100644
--- a/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py
+++ b/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py
@@ -3,8 +3,6 @@ Bootstrap script for IDLE as an application bundle.
"""
import sys, os
-from idlelib.PyShell import main
-
# 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'))
@@ -13,10 +11,54 @@ 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)
-if sys.executable.endswith('-32'):
- sys.executable = os.path.join(sys.prefix, 'bin', 'python-32')
-else:
- sys.executable = os.path.join(sys.prefix, 'bin', 'python')
+#
+# .../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.
@@ -25,6 +67,7 @@ for idx, value in enumerate(sys.argv):
del sys.argv[idx]
break
-#argvemulator.ArgvCollector().mainloop()
+# Now it is safe to import idlelib.
+from idlelib.PyShell import main
if __name__ == '__main__':
main()