/Mac/IDLE/idlemain.py
http://unladen-swallow.googlecode.com/ · Python · 73 lines · 16 code · 8 blank · 49 comment · 5 complexity · b6f084d424f9ec4b430a0fa349336b62 MD5 · raw file
- """
- 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()