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