13ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"""Append module search paths for third-party packages to sys.path. 23ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 33ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel**************************************************************** 43ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel* This module is automatically imported during initialization. * 53ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel**************************************************************** 63ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDanielThis is a UEFI-specific version of site.py. 8d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel 93ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielIn earlier versions of Python (up to 1.5a3), scripts or modules that 103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielneeded to use site-specific modules would place ``import site'' 113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielsomewhere near the top of their code. Because of the automatic 123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielimport, this is no longer necessary (but code that does it still 133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielworks). 143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 15d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDanielThis will append site-specific paths to the module search path. It starts with sys.prefix and 163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielsys.exec_prefix (if different) and appends 173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniellib/python<version>/site-packages as well as lib/site-python. 18d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDanielThe 193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielresulting directories, if they exist, are appended to sys.path, and 203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielalso inspected for path configuration files. 213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielA path configuration file is a file whose name has the form 233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel<package>.pth; its contents are additional directories (one per line) 243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielto be added to sys.path. Non-existing directories (or 253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielnon-directories) are never added to sys.path; no directory is added to 263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielsys.path more than once. Blank lines and lines beginning with 273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel'#' are skipped. Lines starting with 'import' are executed. 283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielFor example, suppose sys.prefix and sys.exec_prefix are set to 30d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel/Efi/StdLib and there is a directory /Efi/StdLib/lib/python27.10/site-packages 313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielwith three subdirectories, foo, bar and spam, and two path 323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielconfiguration files, foo.pth and bar.pth. Assume foo.pth contains the 333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielfollowing: 343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # foo package configuration 363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel foo 373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel bar 383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel bletch 393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieland bar.pth contains: 413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # bar package configuration 433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel bar 443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielThen the following directories are added to sys.path, in this order: 463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 47d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel /Efi/StdLib/lib/python27.10/site-packages/bar 48d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel /Efi/StdLib/lib/python27.10/site-packages/foo 493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielNote that bletch is omitted because it doesn't exist; bar precedes foo 513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielbecause bar.pth comes alphabetically before foo.pth; and spam is 523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielomitted because it is not mentioned in either path configuration file. 533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielAfter these path manipulations, an attempt is made to import a module 553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielnamed sitecustomize, which can perform arbitrary additional 563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielsite-specific customizations. If this import fails with an 573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielImportError exception, it is silently ignored. 583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 59d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDanielCopyright (c) 2015, Daryl McDaniel. All rights reserved.<BR> 60d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDanielCopyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR> 61d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDanielThis program and the accompanying materials are licensed and made available under 62d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDanielthe terms and conditions of the BSD License that accompanies this distribution. 63d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDanielThe full text of the license may be found at 64d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDanielhttp://opensource.org/licenses/bsd-license. 65d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel 66d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDanielTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 67d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDanielWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel""" 693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielimport sys 713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielimport os 723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielimport __builtin__ 733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielimport traceback 743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel# Prefixes for site-packages; add additional prefixes like /usr/local here 763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielPREFIXES = [sys.prefix, sys.exec_prefix] 773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel# Enable per user site-packages directory 783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel# set it to False to disable the feature or True to force the feature 79d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDanielENABLE_USER_SITE = False 803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel# for distutils.commands.install 823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel# These values are initialized by the getuserbase() and getusersitepackages() 833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel# functions, through the main() function when Python starts. 843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielUSER_SITE = None 853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielUSER_BASE = None 863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef makepath(*paths): 893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel dir = os.path.join(*paths) 903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel try: 913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel dir = os.path.abspath(dir) 923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except OSError: 933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pass 943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return dir, os.path.normcase(dir) 953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef abs__file__(): 983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Set all module' __file__ attribute to an absolute path""" 993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for m in sys.modules.values(): 1003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if hasattr(m, '__loader__'): 1013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel continue # don't mess with a PEP 302-supplied __file__ 1023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel try: 1033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel m.__file__ = os.path.abspath(m.__file__) 1043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except (AttributeError, OSError): 1053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pass 1063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef removeduppaths(): 1093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """ Remove duplicate entries from sys.path along with making them 1103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel absolute""" 1113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # This ensures that the initial path provided by the interpreter contains 1123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # only absolute pathnames, even if we're running from the build directory. 1133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel L = [] 1143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel known_paths = set() 1153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for dir in sys.path: 1163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # Filter out duplicate paths (on case-insensitive file systems also 1173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # if they only differ in case); turn relative paths into absolute 1183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # paths. 1193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel dir, dircase = makepath(dir) 1203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if not dircase in known_paths: 1213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel L.append(dir) 1223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel known_paths.add(dircase) 1233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel sys.path[:] = L 1243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return known_paths 1253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef _init_pathinfo(): 1283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Return a set containing all existing directory entries from sys.path""" 1293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel d = set() 1303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for dir in sys.path: 1313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel try: 1323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if os.path.isdir(dir): 1333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel dir, dircase = makepath(dir) 1343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel d.add(dircase) 1353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except TypeError: 1363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel continue 1373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return d 1383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef addpackage(sitedir, name, known_paths): 1413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Process a .pth file within the site-packages directory: 1423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel For each line in the file, either combine it with sitedir to a path 1433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel and add that to known_paths, or execute it if it starts with 'import '. 1443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """ 1453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if known_paths is None: 1463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel _init_pathinfo() 1473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel reset = 1 1483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else: 1493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel reset = 0 1503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fullname = os.path.join(sitedir, name) 1513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel try: 1523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel f = open(fullname, "rU") 1533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except IOError: 1543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return 1553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel with f: 1563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for n, line in enumerate(f): 1573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if line.startswith("#"): 1583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel continue 1593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel try: 1603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if line.startswith(("import ", "import\t")): 1613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel exec line 1623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel continue 1633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel line = line.rstrip() 1643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel dir, dircase = makepath(sitedir, line) 1653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if not dircase in known_paths and os.path.exists(dir): 1663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel sys.path.append(dir) 1673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel known_paths.add(dircase) 1683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except Exception as err: 1693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel print >>sys.stderr, "Error processing line {:d} of {}:\n".format( 1703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel n+1, fullname) 1713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for record in traceback.format_exception(*sys.exc_info()): 1723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for line in record.splitlines(): 1733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel print >>sys.stderr, ' '+line 1743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel print >>sys.stderr, "\nRemainder of file ignored" 1753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel break 1763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if reset: 1773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel known_paths = None 1783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return known_paths 1793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef addsitedir(sitedir, known_paths=None): 1823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Add 'sitedir' argument to sys.path if missing and handle .pth files in 1833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 'sitedir'""" 1843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if known_paths is None: 1853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel known_paths = _init_pathinfo() 1863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel reset = 1 1873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else: 1883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel reset = 0 1893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel sitedir, sitedircase = makepath(sitedir) 1903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if not sitedircase in known_paths: 1913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel sys.path.append(sitedir) # Add path component 1923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel try: 1933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel names = os.listdir(sitedir) 1943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except os.error: 1953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return 1963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel dotpth = os.extsep + "pth" 1973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel names = [name for name in names if name.endswith(dotpth)] 1983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for name in sorted(names): 1993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel addpackage(sitedir, name, known_paths) 2003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if reset: 2013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel known_paths = None 2023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return known_paths 2033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef check_enableusersite(): 2063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Check if user site directory is safe for inclusion 2073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel The function tests for the command line flag (including environment var), 2093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel process uid/gid equal to effective uid/gid. 2103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel None: Disabled for security reasons 2123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel False: Disabled by user (command line option) 2133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel True: Safe and enabled 2143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """ 2153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if sys.flags.no_user_site: 2163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return False 2173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if hasattr(os, "getuid") and hasattr(os, "geteuid"): 2193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # check process uid == effective uid 2203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if os.geteuid() != os.getuid(): 2213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return None 2223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if hasattr(os, "getgid") and hasattr(os, "getegid"): 2233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # check process gid == effective gid 2243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if os.getegid() != os.getgid(): 2253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return None 2263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return True 2283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef getuserbase(): 2303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Returns the `user base` directory path. 2313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel The `user base` directory can be used to store data. If the global 2333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel variable ``USER_BASE`` is not initialized yet, this function will also set 2343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel it. 2353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """ 2363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel global USER_BASE 2373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if USER_BASE is not None: 2383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return USER_BASE 2393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel from sysconfig import get_config_var 2403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel USER_BASE = get_config_var('userbase') 2413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return USER_BASE 2423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef getusersitepackages(): 2443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Returns the user-specific site-packages directory path. 2453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel If the global variable ``USER_SITE`` is not initialized yet, this 2473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel function will also set it. 2483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """ 2493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel global USER_SITE 2503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel user_base = getuserbase() # this will also set USER_BASE 2513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if USER_SITE is not None: 2533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return USER_SITE 2543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel from sysconfig import get_path 2563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel import os 2573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel USER_SITE = get_path('purelib', '%s_user' % os.name) 2593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return USER_SITE 2603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef addusersitepackages(known_paths): 2623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Add a per user site-package to sys.path 2633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Each user has its own python directory with site-packages in the 2653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel home directory. 2663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """ 2673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if ENABLE_USER_SITE and os.path.isdir(user_site): 268d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel # get the per user site-package path 269d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel # this call will also make sure USER_BASE and USER_SITE are set 270d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel user_site = getusersitepackages() 271d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel 2723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel addsitedir(user_site, known_paths) 2733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return known_paths 2743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef getsitepackages(): 2763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Returns a list containing all global site-packages directories 2773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel (and possibly site-python). 2783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel For each directory present in the global ``PREFIXES``, this function 2803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel will find its `site-packages` subdirectory depending on the system 2813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel environment, and will return a list of full paths. 2823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """ 2833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel sitepackages = [] 2843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel seen = set() 2853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for prefix in PREFIXES: 2873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if not prefix or prefix in seen: 2883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel continue 2893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel seen.add(prefix) 2903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 291d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel ix = sys.version.find(' ') 292d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel if ix != -1: 293d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel micro = sys.version[4:ix] 2943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else: 295d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel micro = '0' 296d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel 297d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel sitepackages.append(os.path.join(prefix, "lib", 298d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel "python" + sys.version[0] + sys.version[2] + '.' + micro, 299d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel "site-packages")) 300d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel sitepackages.append(os.path.join(prefix, "lib", "site-python")) 3013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return sitepackages 3023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef addsitepackages(known_paths): 3043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Add site-packages (and possibly site-python) to sys.path""" 3053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for sitedir in getsitepackages(): 3063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if os.path.isdir(sitedir): 3073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel addsitedir(sitedir, known_paths) 3083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return known_paths 3103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef setBEGINLIBPATH(): 312d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel """The UEFI port has optional extension modules that do double duty 313d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel as DLLs (even though they have .efi file extensions) for other extensions. 3143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel The library search path needs to be amended so these will be found 3153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel during module import. Use BEGINLIBPATH so that these are at the start 3163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel of the library search path. 3173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """ 3193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload") 320d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel libpath = os.environ['BEGINLIBPATH'].split(os.path.pathsep) 3213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if libpath[-1]: 3223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel libpath.append(dllpath) 3233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else: 3243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel libpath[-1] = dllpath 325d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel os.environ['BEGINLIBPATH'] = os.path.pathsep.join(libpath) 3263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef setquit(): 3293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Define new builtins 'quit' and 'exit'. 3303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel These are objects which make the interpreter exit when called. 3323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel The repr of each object contains a hint at how it works. 3333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """ 335d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel eof = 'Ctrl-D (i.e. EOF)' 3363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel class Quitter(object): 3383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel def __init__(self, name): 3393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel self.name = name 3403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel def __repr__(self): 3413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return 'Use %s() or %s to exit' % (self.name, eof) 3423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel def __call__(self, code=None): 3433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # Shells like IDLE catch the SystemExit, but listen when their 3443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # stdin wrapper is closed. 3453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel try: 3463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel sys.stdin.close() 3473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except: 3483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pass 3493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel raise SystemExit(code) 3503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel __builtin__.quit = Quitter('quit') 3513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel __builtin__.exit = Quitter('exit') 3523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielclass _Printer(object): 3553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """interactive prompt objects for printing the license text, a list of 3563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel contributors and the copyright notice.""" 3573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel MAXLINES = 23 3593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel def __init__(self, name, data, files=(), dirs=()): 3613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel self.__name = name 3623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel self.__data = data 3633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel self.__files = files 3643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel self.__dirs = dirs 3653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel self.__lines = None 3663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel def __setup(self): 3683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if self.__lines: 3693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return 3703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel data = None 3713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for dir in self.__dirs: 3723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for filename in self.__files: 3733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel filename = os.path.join(dir, filename) 3743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel try: 3753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fp = file(filename, "rU") 3763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel data = fp.read() 3773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fp.close() 3783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel break 3793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except IOError: 3803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pass 3813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if data: 3823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel break 3833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if not data: 3843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel data = self.__data 3853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel self.__lines = data.split('\n') 3863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel self.__linecnt = len(self.__lines) 3873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel def __repr__(self): 3893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel self.__setup() 3903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if len(self.__lines) <= self.MAXLINES: 3913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return "\n".join(self.__lines) 3923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else: 3933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return "Type %s() to see the full %s text" % ((self.__name,)*2) 3943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel def __call__(self): 3963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel self.__setup() 3973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel prompt = 'Hit Return for more, or q (and Return) to quit: ' 3983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel lineno = 0 3993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel while 1: 4003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel try: 4013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for i in range(lineno, lineno + self.MAXLINES): 4023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel print self.__lines[i] 4033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except IndexError: 4043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel break 4053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else: 4063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel lineno += self.MAXLINES 4073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel key = None 4083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel while key is None: 4093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel key = raw_input(prompt) 4103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if key not in ('', 'q'): 4113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel key = None 4123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if key == 'q': 4133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel break 4143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef setcopyright(): 4163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Set 'copyright' and 'credits' in __builtin__""" 4173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel __builtin__.copyright = _Printer("copyright", sys.copyright) 418d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel __builtin__.credits = _Printer("credits", """\ 4193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands 4203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for supporting Python development. See www.python.org for more information.""") 4213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel here = os.path.dirname(os.__file__) 4223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel __builtin__.license = _Printer( 4233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "license", "See https://www.python.org/psf/license/", 4243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ["LICENSE.txt", "LICENSE"], 4253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel [os.path.join(here, os.pardir), here, os.curdir]) 4263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielclass _Helper(object): 4293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Define the builtin 'help'. 4303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel This is a wrapper around pydoc.help (with a twist). 4313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """ 4333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel def __repr__(self): 4353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return "Type help() for interactive help, " \ 4363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "or help(object) for help about object." 4373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel def __call__(self, *args, **kwds): 4383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel import pydoc 4393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return pydoc.help(*args, **kwds) 4403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef sethelper(): 4423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel __builtin__.help = _Helper() 4433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef setencoding(): 4453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Set the string encoding used by the Unicode implementation. The 4463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel default is 'ascii', but if you're willing to experiment, you can 4473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel change this.""" 4483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel encoding = "ascii" # Default value set by _PyUnicode_Init() 4493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if 0: 4503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # Enable to support locale aware default string encodings. 4513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel import locale 4523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel loc = locale.getdefaultlocale() 4533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if loc[1]: 4543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel encoding = loc[1] 4553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if 0: 4563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # Enable to switch off string to Unicode coercion and implicit 4573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # Unicode to string conversion. 4583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel encoding = "undefined" 4593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if encoding != "ascii": 4603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # On Non-Unicode builds this will raise an AttributeError... 4613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel sys.setdefaultencoding(encoding) # Needs Python Unicode build ! 4623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef execsitecustomize(): 4653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Run custom site specific code, if available.""" 4663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel try: 4673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel import sitecustomize 4683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except ImportError: 4693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pass 4703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except Exception: 4713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if sys.flags.verbose: 4723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel sys.excepthook(*sys.exc_info()) 4733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else: 4743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel print >>sys.stderr, \ 4753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "'import sitecustomize' failed; use -v for traceback" 4763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef execusercustomize(): 4793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """Run custom user specific code, if available.""" 4803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel try: 4813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel import usercustomize 4823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except ImportError: 4833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pass 4843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel except Exception: 4853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if sys.flags.verbose: 4863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel sys.excepthook(*sys.exc_info()) 4873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else: 4883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel print>>sys.stderr, \ 4893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "'import usercustomize' failed; use -v for traceback" 4903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef main(): 4933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel global ENABLE_USER_SITE 4943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel abs__file__() 4963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel known_paths = removeduppaths() 4973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if ENABLE_USER_SITE is None: 4983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ENABLE_USER_SITE = check_enableusersite() 4993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel known_paths = addusersitepackages(known_paths) 5003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel known_paths = addsitepackages(known_paths) 5013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel setquit() 5023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel setcopyright() 5033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel sethelper() 5043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel setencoding() 5053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel execsitecustomize() 5063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # Remove sys.setdefaultencoding() so that users cannot change the 5073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # encoding after initialization. The test for presence is needed when 5083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel # this module is run as a script, because this code is executed twice. 5093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if hasattr(sys, "setdefaultencoding"): 5103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel del sys.setdefaultencoding 5113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielmain() 5133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldef _script(): 5153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel help = """\ 516d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel %s 517d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel 518d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel Path elements are normally separated by '%s'. 5193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel """ 520d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel 521d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel print "sys.path = [" 522d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel for dir in sys.path: 523d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel print " %r," % (dir,) 524d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel print "]" 525d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel 526d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel import textwrap 527d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel print textwrap.dedent(help % (sys.argv[0], os.pathsep)) 528d11973f1cae1d8e25017b09734fbf419342b192aDaryl McDaniel sys.exit(0) 5293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielif __name__ == '__main__': 5313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel _script() 532