14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Append module search paths for third-party packages to sys.path. 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm**************************************************************** 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm* This module is automatically imported during initialization. * 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm**************************************************************** 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIn earlier versions of Python (up to 1.5a3), scripts or modules that 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmneeded to use site-specific modules would place ``import site'' 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsomewhere near the top of their code. Because of the automatic 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport, this is no longer necessary (but code that does it still 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmworks). 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThis will append site-specific paths to the module search path. On 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUnix (including Mac OSX), it starts with sys.prefix and 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys.exec_prefix (if different) and appends 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlib/python<version>/site-packages as well as lib/site-python. 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmOn other platforms (such as Windows), it tries each of the 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmprefixes directly, as well as with lib/site-packages appended. The 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmresulting directories, if they exist, are appended to sys.path, and 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmalso inspected for path configuration files. 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmA path configuration file is a file whose name has the form 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm<package>.pth; its contents are additional directories (one per line) 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmto be added to sys.path. Non-existing directories (or 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnon-directories) are never added to sys.path; no directory is added to 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys.path more than once. Blank lines and lines beginning with 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm'#' are skipped. Lines starting with 'import' are executed. 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFor example, suppose sys.prefix and sys.exec_prefix are set to 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/usr/local and there is a directory /usr/local/lib/python2.5/site-packages 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwith three subdirectories, foo, bar and spam, and two path 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconfiguration files, foo.pth and bar.pth. Assume foo.pth contains the 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfollowing: 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # foo package configuration 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm foo 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bar 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bletch 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmand bar.pth contains: 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # bar package configuration 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bar 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThen the following directories are added to sys.path, in this order: 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /usr/local/lib/python2.5/site-packages/bar 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /usr/local/lib/python2.5/site-packages/foo 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmNote that bletch is omitted because it doesn't exist; bar precedes foo 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbecause bar.pth comes alphabetically before foo.pth; and spam is 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmomitted because it is not mentioned in either path configuration file. 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAfter these path manipulations, an attempt is made to import a module 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnamed sitecustomize, which can perform arbitrary additional 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsite-specific customizations. If this import fails with an 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmImportError exception, it is silently ignored. 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm""" 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport __builtin__ 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport traceback 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Prefixes for site-packages; add additional prefixes like /usr/local here 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPREFIXES = [sys.prefix, sys.exec_prefix] 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Enable per user site-packages directory 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# set it to False to disable the feature or True to force the feature 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmENABLE_USER_SITE = None 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# for distutils.commands.install 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# These values are initialized by the getuserbase() and getusersitepackages() 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# functions, through the main() function when Python starts. 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUSER_SITE = None 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUSER_BASE = None 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef makepath(*paths): 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dir = os.path.join(*paths) 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dir = os.path.abspath(dir) 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except OSError: 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return dir, os.path.normcase(dir) 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef abs__file__(): 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Set all module' __file__ attribute to an absolute path""" 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for m in sys.modules.values(): 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if hasattr(m, '__loader__'): 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue # don't mess with a PEP 302-supplied __file__ 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m.__file__ = os.path.abspath(m.__file__) 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except (AttributeError, OSError): 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef removeduppaths(): 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ Remove duplicate entries from sys.path along with making them 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm absolute""" 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # This ensures that the initial path provided by the interpreter contains 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # only absolute pathnames, even if we're running from the build directory. 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm L = [] 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm known_paths = set() 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for dir in sys.path: 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Filter out duplicate paths (on case-insensitive file systems also 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # if they only differ in case); turn relative paths into absolute 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # paths. 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dir, dircase = makepath(dir) 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not dircase in known_paths: 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm L.append(dir) 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm known_paths.add(dircase) 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.path[:] = L 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return known_paths 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# XXX This should not be part of site.py, since it is needed even when 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# using the -S option for Python. See http://www.python.org/sf/586680 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef addbuilddir(): 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Append ./build/lib.<platform> in case we're running in the build dir 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (especially for Guido :-)""" 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from sysconfig import get_platform 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = "build/lib.%s-%.3s" % (get_platform(), sys.version) 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if hasattr(sys, 'gettotalrefcount'): 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s += '-pydebug' 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = os.path.join(os.path.dirname(sys.path.pop()), s) 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.path.append(s) 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef _init_pathinfo(): 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Return a set containing all existing directory entries from sys.path""" 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = set() 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for dir in sys.path: 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if os.path.isdir(dir): 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dir, dircase = makepath(dir) 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.add(dircase) 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except TypeError: 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return d 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef addpackage(sitedir, name, known_paths): 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Process a .pth file within the site-packages directory: 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm For each line in the file, either combine it with sitedir to a path 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm and add that to known_paths, or execute it if it starts with 'import '. 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if known_paths is None: 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _init_pathinfo() 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm reset = 1 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm reset = 0 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fullname = os.path.join(sitedir, name) 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f = open(fullname, "rU") 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except IOError: 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with f: 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for n, line in enumerate(f): 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if line.startswith("#"): 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if line.startswith(("import ", "import\t")): 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exec line 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm line = line.rstrip() 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dir, dircase = makepath(sitedir, line) 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not dircase in known_paths and os.path.exists(dir): 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.path.append(dir) 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm known_paths.add(dircase) 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except Exception as err: 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print >>sys.stderr, "Error processing line {:d} of {}:\n".format( 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n+1, fullname) 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for record in traceback.format_exception(*sys.exc_info()): 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for line in record.splitlines(): 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print >>sys.stderr, ' '+line 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print >>sys.stderr, "\nRemainder of file ignored" 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if reset: 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm known_paths = None 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return known_paths 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef addsitedir(sitedir, known_paths=None): 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Add 'sitedir' argument to sys.path if missing and handle .pth files in 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'sitedir'""" 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if known_paths is None: 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm known_paths = _init_pathinfo() 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm reset = 1 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm reset = 0 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sitedir, sitedircase = makepath(sitedir) 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not sitedircase in known_paths: 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.path.append(sitedir) # Add path component 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names = os.listdir(sitedir) 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except os.error: 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dotpth = os.extsep + "pth" 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names = [name for name in names if name.endswith(dotpth)] 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for name in sorted(names): 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm addpackage(sitedir, name, known_paths) 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if reset: 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm known_paths = None 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return known_paths 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef check_enableusersite(): 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Check if user site directory is safe for inclusion 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The function tests for the command line flag (including environment var), 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm process uid/gid equal to effective uid/gid. 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm None: Disabled for security reasons 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm False: Disabled by user (command line option) 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm True: Safe and enabled 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sys.flags.no_user_site: 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return False 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if hasattr(os, "getuid") and hasattr(os, "geteuid"): 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # check process uid == effective uid 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if os.geteuid() != os.getuid(): 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return None 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if hasattr(os, "getgid") and hasattr(os, "getegid"): 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # check process gid == effective gid 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if os.getegid() != os.getgid(): 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return None 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return True 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef getuserbase(): 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Returns the `user base` directory path. 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The `user base` directory can be used to store data. If the global 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm variable ``USER_BASE`` is not initialized yet, this function will also set 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm it. 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm global USER_BASE 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if USER_BASE is not None: 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return USER_BASE 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from sysconfig import get_config_var 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm USER_BASE = get_config_var('userbase') 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return USER_BASE 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef getusersitepackages(): 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Returns the user-specific site-packages directory path. 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm If the global variable ``USER_SITE`` is not initialized yet, this 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm function will also set it. 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm global USER_SITE 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm user_base = getuserbase() # this will also set USER_BASE 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if USER_SITE is not None: 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return USER_SITE 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from sysconfig import get_path 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import os 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sys.platform == 'darwin': 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from sysconfig import get_config_var 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if get_config_var('PYTHONFRAMEWORK'): 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm USER_SITE = get_path('purelib', 'osx_framework_user') 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return USER_SITE 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm USER_SITE = get_path('purelib', '%s_user' % os.name) 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return USER_SITE 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef addusersitepackages(known_paths): 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Add a per user site-package to sys.path 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Each user has its own python directory with site-packages in the 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm home directory. 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # get the per user site-package path 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # this call will also make sure USER_BASE and USER_SITE are set 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm user_site = getusersitepackages() 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ENABLE_USER_SITE and os.path.isdir(user_site): 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm addsitedir(user_site, known_paths) 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return known_paths 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef getsitepackages(): 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Returns a list containing all global site-packages directories 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (and possibly site-python). 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm For each directory present in the global ``PREFIXES``, this function 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm will find its `site-packages` subdirectory depending on the system 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm environment, and will return a list of full paths. 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sitepackages = [] 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seen = set() 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for prefix in PREFIXES: 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not prefix or prefix in seen: 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seen.add(prefix) 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sys.platform in ('os2emx', 'riscos'): 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sitepackages.append(os.path.join(prefix, "Lib", "site-packages")) 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif os.sep == '/': 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sitepackages.append(os.path.join(prefix, "lib", 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "python" + sys.version[:3], 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "site-packages")) 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sitepackages.append(os.path.join(prefix, "lib", "site-python")) 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sitepackages.append(prefix) 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sitepackages.append(os.path.join(prefix, "lib", "site-packages")) 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sys.platform == "darwin": 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # for framework builds *only* we add the standard Apple 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # locations. 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from sysconfig import get_config_var 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm framework = get_config_var("PYTHONFRAMEWORK") 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if framework and "/%s.framework/"%(framework,) in prefix: 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sitepackages.append( 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.path.join("/Library", framework, 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.version[:3], "site-packages")) 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return sitepackages 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef addsitepackages(known_paths): 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Add site-packages (and possibly site-python) to sys.path""" 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for sitedir in getsitepackages(): 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if os.path.isdir(sitedir): 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm addsitedir(sitedir, known_paths) 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return known_paths 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef setBEGINLIBPATH(): 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """The OS/2 EMX port has optional extension modules that do double duty 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm as DLLs (and must use the .DLL file extension) for other extensions. 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The library search path needs to be amended so these will be found 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm during module import. Use BEGINLIBPATH so that these are at the start 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm of the library search path. 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload") 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm libpath = os.environ['BEGINLIBPATH'].split(';') 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if libpath[-1]: 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm libpath.append(dllpath) 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm libpath[-1] = dllpath 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.environ['BEGINLIBPATH'] = ';'.join(libpath) 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef setquit(): 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Define new builtins 'quit' and 'exit'. 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm These are objects which make the interpreter exit when called. 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The repr of each object contains a hint at how it works. 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if os.sep == ':': 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm eof = 'Cmd-Q' 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif os.sep == '\\': 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm eof = 'Ctrl-Z plus Return' 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm eof = 'Ctrl-D (i.e. EOF)' 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Quitter(object): 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, name): 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.name = name 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __repr__(self): 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 'Use %s() or %s to exit' % (self.name, eof) 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __call__(self, code=None): 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Shells like IDLE catch the SystemExit, but listen when their 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # stdin wrapper is closed. 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.stdin.close() 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except: 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SystemExit(code) 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __builtin__.quit = Quitter('quit') 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __builtin__.exit = Quitter('exit') 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass _Printer(object): 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """interactive prompt objects for printing the license text, a list of 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm contributors and the copyright notice.""" 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm MAXLINES = 23 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, name, data, files=(), dirs=()): 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__name = name 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__data = data 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__files = files 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__dirs = dirs 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__lines = None 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __setup(self): 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.__lines: 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm data = None 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for dir in self.__dirs: 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for filename in self.__files: 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm filename = os.path.join(dir, filename) 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fp = file(filename, "rU") 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm data = fp.read() 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fp.close() 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except IOError: 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if data: 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not data: 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm data = self.__data 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__lines = data.split('\n') 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__linecnt = len(self.__lines) 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __repr__(self): 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__setup() 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(self.__lines) <= self.MAXLINES: 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "\n".join(self.__lines) 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "Type %s() to see the full %s text" % ((self.__name,)*2) 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __call__(self): 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__setup() 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm prompt = 'Hit Return for more, or q (and Return) to quit: ' 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno = 0 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while 1: 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(lineno, lineno + self.MAXLINES): 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print self.__lines[i] 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except IndexError: 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno += self.MAXLINES 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key = None 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while key is None: 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key = raw_input(prompt) 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if key not in ('', 'q'): 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key = None 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if key == 'q': 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef setcopyright(): 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Set 'copyright' and 'credits' in __builtin__""" 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __builtin__.copyright = _Printer("copyright", sys.copyright) 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sys.platform[:4] == 'java': 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __builtin__.credits = _Printer( 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "credits", 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Jython is maintained by the Jython developers (www.jython.org).") 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __builtin__.credits = _Printer("credits", """\ 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for supporting Python development. See www.python.org for more information.""") 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm here = os.path.dirname(os.__file__) 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __builtin__.license = _Printer( 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "license", "See http://www.python.org/%.3s/license.html" % sys.version, 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ["LICENSE.txt", "LICENSE"], 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [os.path.join(here, os.pardir), here, os.curdir]) 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass _Helper(object): 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Define the builtin 'help'. 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm This is a wrapper around pydoc.help (with a twist). 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __repr__(self): 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "Type help() for interactive help, " \ 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "or help(object) for help about object." 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __call__(self, *args, **kwds): 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import pydoc 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return pydoc.help(*args, **kwds) 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef sethelper(): 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __builtin__.help = _Helper() 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef aliasmbcs(): 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """On Windows, some default encodings are not provided by Python, 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while they are always available as "mbcs" in each locale. Make 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm them usable by aliasing to "mbcs" in such a case.""" 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sys.platform == 'win32': 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import locale, codecs 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm enc = locale.getdefaultlocale()[1] 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if enc.startswith('cp'): # "cp***" ? 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm codecs.lookup(enc) 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except LookupError: 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import encodings 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm encodings._cache[enc] = encodings._unknown 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm encodings.aliases.aliases[enc] = 'mbcs' 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef setencoding(): 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Set the string encoding used by the Unicode implementation. The 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default is 'ascii', but if you're willing to experiment, you can 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm change this.""" 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm encoding = "ascii" # Default value set by _PyUnicode_Init() 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if 0: 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Enable to support locale aware default string encodings. 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import locale 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm loc = locale.getdefaultlocale() 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if loc[1]: 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm encoding = loc[1] 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if 0: 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Enable to switch off string to Unicode coercion and implicit 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Unicode to string conversion. 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm encoding = "undefined" 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if encoding != "ascii": 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # On Non-Unicode builds this will raise an AttributeError... 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.setdefaultencoding(encoding) # Needs Python Unicode build ! 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef execsitecustomize(): 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Run custom site specific code, if available.""" 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import sitecustomize 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except ImportError: 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except Exception: 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sys.flags.verbose: 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.excepthook(*sys.exc_info()) 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print >>sys.stderr, \ 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "'import sitecustomize' failed; use -v for traceback" 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef execusercustomize(): 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Run custom user specific code, if available.""" 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import usercustomize 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except ImportError: 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except Exception: 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sys.flags.verbose: 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.excepthook(*sys.exc_info()) 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print>>sys.stderr, \ 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "'import usercustomize' failed; use -v for traceback" 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef main(): 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm global ENABLE_USER_SITE 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm abs__file__() 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm known_paths = removeduppaths() 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (os.name == "posix" and sys.path and 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.path.basename(sys.path[-1]) == "Modules"): 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm addbuilddir() 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ENABLE_USER_SITE is None: 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ENABLE_USER_SITE = check_enableusersite() 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm known_paths = addusersitepackages(known_paths) 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm known_paths = addsitepackages(known_paths) 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sys.platform == 'os2emx': 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm setBEGINLIBPATH() 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm setquit() 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm setcopyright() 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sethelper() 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm aliasmbcs() 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm setencoding() 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm execsitecustomize() 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ENABLE_USER_SITE: 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm execusercustomize() 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Remove sys.setdefaultencoding() so that users cannot change the 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # encoding after initialization. The test for presence is needed when 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # this module is run as a script, because this code is executed twice. 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if hasattr(sys, "setdefaultencoding"): 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del sys.setdefaultencoding 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmain() 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef _script(): 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm help = """\ 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm %s [--user-base] [--user-site] 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Without arguments print some useful information 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm With arguments print the value of USER_BASE and/or USER_SITE separated 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm by '%s'. 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Exit codes with --user-base or --user-site: 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0 - user site directory is enabled 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1 - user site directory is disabled by user 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2 - uses site directory is disabled by super user 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm or for security reasons 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm >2 - unknown error 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args = sys.argv[1:] 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not args: 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print "sys.path = [" 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for dir in sys.path: 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print " %r," % (dir,) 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print "]" 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print "USER_BASE: %r (%s)" % (USER_BASE, 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "exists" if os.path.isdir(USER_BASE) else "doesn't exist") 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print "USER_SITE: %r (%s)" % (USER_SITE, 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "exists" if os.path.isdir(USER_SITE) else "doesn't exist") 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print "ENABLE_USER_SITE: %r" % ENABLE_USER_SITE 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.exit(0) 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buffer = [] 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if '--user-base' in args: 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buffer.append(USER_BASE) 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if '--user-site' in args: 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buffer.append(USER_SITE) 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if buffer: 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print os.pathsep.join(buffer) 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ENABLE_USER_SITE: 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.exit(0) 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif ENABLE_USER_SITE is False: 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.exit(1) 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif ENABLE_USER_SITE is None: 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.exit(2) 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.exit(3) 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import textwrap 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print textwrap.dedent(help % (sys.argv[0], os.pathsep)) 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.exit(10) 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == '__main__': 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _script() 616