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