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