17db96d56Sopenharmony_ci"""
27db96d56Sopenharmony_ciBootstrap script for IDLE as an application bundle.
37db96d56Sopenharmony_ci"""
47db96d56Sopenharmony_ciimport sys, os
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci# Change the current directory the user's home directory, that way we'll get
77db96d56Sopenharmony_ci# a more useful default location in the open/save dialogs.
87db96d56Sopenharmony_cios.chdir(os.path.expanduser('~/Documents'))
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci# Make sure sys.executable points to the python interpreter inside the
127db96d56Sopenharmony_ci# framework, instead of at the helper executable inside the application
137db96d56Sopenharmony_ci# bundle (the latter works, but doesn't allow access to the window server)
147db96d56Sopenharmony_ci#
157db96d56Sopenharmony_ci#  .../IDLE.app/
167db96d56Sopenharmony_ci#       Contents/
177db96d56Sopenharmony_ci#           MacOS/
187db96d56Sopenharmony_ci#               IDLE (a python script)
197db96d56Sopenharmony_ci#               Python{-32} (symlink)
207db96d56Sopenharmony_ci#           Resources/
217db96d56Sopenharmony_ci#               idlemain.py (this module)
227db96d56Sopenharmony_ci#               ...
237db96d56Sopenharmony_ci#
247db96d56Sopenharmony_ci# ../IDLE.app/Contents/MacOS/Python{-32} is symlinked to
257db96d56Sopenharmony_ci#       ..Library/Frameworks/Python.framework/Versions/m.n
267db96d56Sopenharmony_ci#                   /Resources/Python.app/Contents/MacOS/Python{-32}
277db96d56Sopenharmony_ci#       which is the Python interpreter executable
287db96d56Sopenharmony_ci#
297db96d56Sopenharmony_ci# The flow of control is as follows:
307db96d56Sopenharmony_ci# 1. IDLE.app is launched which starts python running the IDLE script
317db96d56Sopenharmony_ci# 2. IDLE script exports
327db96d56Sopenharmony_ci#       PYTHONEXECUTABLE = .../IDLE.app/Contents/MacOS/Python{-32}
337db96d56Sopenharmony_ci#           (the symlink to the framework python)
347db96d56Sopenharmony_ci# 3. IDLE script alters sys.argv and uses os.execve to replace itself with
357db96d56Sopenharmony_ci#       idlemain.py running under the symlinked python.
367db96d56Sopenharmony_ci#       This is the magic step.
377db96d56Sopenharmony_ci# 4. During interpreter initialization, because PYTHONEXECUTABLE is defined,
387db96d56Sopenharmony_ci#    sys.executable may get set to an useless value.
397db96d56Sopenharmony_ci#
407db96d56Sopenharmony_ci# (Note that the IDLE script and the setting of PYTHONEXECUTABLE is
417db96d56Sopenharmony_ci#  generated automatically by bundlebuilder in the Python 2.x build.
427db96d56Sopenharmony_ci#  Also, IDLE invoked via command line, i.e. bin/idle, bypasses all of
437db96d56Sopenharmony_ci#  this.)
447db96d56Sopenharmony_ci#
457db96d56Sopenharmony_ci# Now fix up the execution environment before importing idlelib.
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci# Reset sys.executable to its normal value, the actual path of
487db96d56Sopenharmony_ci# the interpreter in the framework, by following the symlink
497db96d56Sopenharmony_ci# exported in PYTHONEXECUTABLE.
507db96d56Sopenharmony_cipyex = os.environ['PYTHONEXECUTABLE']
517db96d56Sopenharmony_cisys.executable = os.path.join(sys.prefix, 'bin', 'python%d.%d'%(sys.version_info[:2]))
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci# Remove any sys.path entries for the Resources dir in the IDLE.app bundle.
547db96d56Sopenharmony_cip = pyex.partition('.app')
557db96d56Sopenharmony_ciif p[2].startswith('/Contents/MacOS/Python'):
567db96d56Sopenharmony_ci    sys.path = [value for value in sys.path if
577db96d56Sopenharmony_ci            value.partition('.app') != (p[0], p[1], '/Contents/Resources')]
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci# Unexport PYTHONEXECUTABLE so that the other Python processes started
607db96d56Sopenharmony_ci# by IDLE have a normal sys.executable.
617db96d56Sopenharmony_cidel os.environ['PYTHONEXECUTABLE']
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci# Look for the -psn argument that the launcher adds and remove it, it will
647db96d56Sopenharmony_ci# only confuse the IDLE startup code.
657db96d56Sopenharmony_cifor idx, value in enumerate(sys.argv):
667db96d56Sopenharmony_ci    if value.startswith('-psn_'):
677db96d56Sopenharmony_ci        del sys.argv[idx]
687db96d56Sopenharmony_ci        break
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci# Now it is safe to import idlelib.
717db96d56Sopenharmony_cifrom idlelib.pyshell import main
727db96d56Sopenharmony_ciif __name__ == '__main__':
737db96d56Sopenharmony_ci    main()
74