1b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"""Append module search paths for third-party packages to sys.path.
2b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
3b410d6e4ce58c177569d42b51772f7bb239a24a3darylm****************************************************************
4b410d6e4ce58c177569d42b51772f7bb239a24a3darylm* This module is automatically imported during initialization. *
5b410d6e4ce58c177569d42b51772f7bb239a24a3darylm****************************************************************
6b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
7b410d6e4ce58c177569d42b51772f7bb239a24a3darylmThis is a UEFI-specific version of site.py.
8b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
9b410d6e4ce58c177569d42b51772f7bb239a24a3darylmIn earlier versions of Python (up to 1.5a3), scripts or modules that
10b410d6e4ce58c177569d42b51772f7bb239a24a3darylmneeded to use site-specific modules would place ``import site''
11b410d6e4ce58c177569d42b51772f7bb239a24a3darylmsomewhere near the top of their code.  Because of the automatic
12b410d6e4ce58c177569d42b51772f7bb239a24a3darylmimport, this is no longer necessary (but code that does it still
13b410d6e4ce58c177569d42b51772f7bb239a24a3darylmworks).
14b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
15b410d6e4ce58c177569d42b51772f7bb239a24a3darylmThis will append site-specific paths to the module search path.  It
16b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstarts with sys.prefix and sys.exec_prefix (if different) and appends
17b410d6e4ce58c177569d42b51772f7bb239a24a3darylmlib/python<version>/site-packages as well as lib/site-python.
18b410d6e4ce58c177569d42b51772f7bb239a24a3darylmThe resulting directories, if they exist, are appended to sys.path,
19b410d6e4ce58c177569d42b51772f7bb239a24a3darylmand also inspected for path configuration files.
20b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
21b410d6e4ce58c177569d42b51772f7bb239a24a3darylmA path configuration file is a file whose name has the form
22b410d6e4ce58c177569d42b51772f7bb239a24a3darylm<package>.pth; its contents are additional directories (one per line)
23b410d6e4ce58c177569d42b51772f7bb239a24a3darylmto be added to sys.path.  Non-existing directories (or
24b410d6e4ce58c177569d42b51772f7bb239a24a3darylmnon-directories) are never added to sys.path; no directory is added to
25b410d6e4ce58c177569d42b51772f7bb239a24a3darylmsys.path more than once.  Blank lines and lines beginning with
26b410d6e4ce58c177569d42b51772f7bb239a24a3darylm'#' are skipped. Lines starting with 'import' are executed.
27b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
28b410d6e4ce58c177569d42b51772f7bb239a24a3darylmFor example, suppose sys.prefix and sys.exec_prefix are set to
29b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/Efi/StdLib and there is a directory /Efi/StdLib/lib/python2.7/site-packages
30b410d6e4ce58c177569d42b51772f7bb239a24a3darylmwith three subdirectories, foo, bar and spam, and two path
31b410d6e4ce58c177569d42b51772f7bb239a24a3darylmconfiguration files, foo.pth and bar.pth.  Assume foo.pth contains the
32b410d6e4ce58c177569d42b51772f7bb239a24a3darylmfollowing:
33b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
34b410d6e4ce58c177569d42b51772f7bb239a24a3darylm  # foo package configuration
35b410d6e4ce58c177569d42b51772f7bb239a24a3darylm  foo
36b410d6e4ce58c177569d42b51772f7bb239a24a3darylm  bar
37b410d6e4ce58c177569d42b51772f7bb239a24a3darylm  bletch
38b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
39b410d6e4ce58c177569d42b51772f7bb239a24a3darylmand bar.pth contains:
40b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
41b410d6e4ce58c177569d42b51772f7bb239a24a3darylm  # bar package configuration
42b410d6e4ce58c177569d42b51772f7bb239a24a3darylm  bar
43b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
44b410d6e4ce58c177569d42b51772f7bb239a24a3darylmThen the following directories are added to sys.path, in this order:
45b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
46b410d6e4ce58c177569d42b51772f7bb239a24a3darylm  /Efi/StdLib/lib/python2.7/site-packages/bar
47b410d6e4ce58c177569d42b51772f7bb239a24a3darylm  /Efi/StdLib/lib/python2.7/site-packages/foo
48b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
49b410d6e4ce58c177569d42b51772f7bb239a24a3darylmNote that bletch is omitted because it doesn't exist; bar precedes foo
50b410d6e4ce58c177569d42b51772f7bb239a24a3darylmbecause bar.pth comes alphabetically before foo.pth; and spam is
51b410d6e4ce58c177569d42b51772f7bb239a24a3darylmomitted because it is not mentioned in either path configuration file.
52b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
53b410d6e4ce58c177569d42b51772f7bb239a24a3darylmAfter these path manipulations, an attempt is made to import a module
54b410d6e4ce58c177569d42b51772f7bb239a24a3darylmnamed sitecustomize, which can perform arbitrary additional
55b410d6e4ce58c177569d42b51772f7bb239a24a3darylmsite-specific customizations.  If this import fails with an
56b410d6e4ce58c177569d42b51772f7bb239a24a3darylmImportError exception, it is silently ignored.
57b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
58b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCopyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
59b410d6e4ce58c177569d42b51772f7bb239a24a3darylmThis program and the accompanying materials are licensed and made available under
60b410d6e4ce58c177569d42b51772f7bb239a24a3darylmthe terms and conditions of the BSD License that accompanies this distribution.
61b410d6e4ce58c177569d42b51772f7bb239a24a3darylmThe full text of the license may be found at
62b410d6e4ce58c177569d42b51772f7bb239a24a3darylmhttp://opensource.org/licenses/bsd-license.
63b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
64b410d6e4ce58c177569d42b51772f7bb239a24a3darylmTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
65b410d6e4ce58c177569d42b51772f7bb239a24a3darylmWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
66b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"""
67b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
68b410d6e4ce58c177569d42b51772f7bb239a24a3darylmimport sys
69b410d6e4ce58c177569d42b51772f7bb239a24a3darylmimport os
70b410d6e4ce58c177569d42b51772f7bb239a24a3darylmimport __builtin__
71b410d6e4ce58c177569d42b51772f7bb239a24a3darylmimport traceback
72b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
73b410d6e4ce58c177569d42b51772f7bb239a24a3darylm# Prefixes for site-packages; add additional prefixes like /usr/local here
74b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPREFIXES = [sys.prefix, sys.exec_prefix]
75b410d6e4ce58c177569d42b51772f7bb239a24a3darylm# Enable per user site-packages directory
76b410d6e4ce58c177569d42b51772f7bb239a24a3darylm# set it to False to disable the feature or True to force the feature
77b410d6e4ce58c177569d42b51772f7bb239a24a3darylmENABLE_USER_SITE = False
78b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
79b410d6e4ce58c177569d42b51772f7bb239a24a3darylm# for distutils.commands.install
80b410d6e4ce58c177569d42b51772f7bb239a24a3darylm# These values are initialized by the getuserbase() and getusersitepackages()
81b410d6e4ce58c177569d42b51772f7bb239a24a3darylm# functions, through the main() function when Python starts.
82b410d6e4ce58c177569d42b51772f7bb239a24a3darylmUSER_SITE = None
83b410d6e4ce58c177569d42b51772f7bb239a24a3darylmUSER_BASE = None
84b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
85b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
86b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef makepath(*paths):
87b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    dir = os.path.join(*paths)
88b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    try:
89b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        dir = os.path.abspath(dir)
90b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    except OSError:
91b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        pass
92b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    return dir, os.path.normcase(dir)
93b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
94b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
95b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef abs__file__():
96b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Set all module' __file__ attribute to an absolute path"""
97b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    for m in sys.modules.values():
98b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        if hasattr(m, '__loader__'):
99b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            continue   # don't mess with a PEP 302-supplied __file__
100b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        try:
101b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            m.__file__ = os.path.abspath(m.__file__)
102b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        except (AttributeError, OSError):
103b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            pass
104b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
105b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
106b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef removeduppaths():
107b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """ Remove duplicate entries from sys.path along with making them
108b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    absolute"""
109b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    # This ensures that the initial path provided by the interpreter contains
110b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    # only absolute pathnames, even if we're running from the build directory.
111b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    L = []
112b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    known_paths = set()
113b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    for dir in sys.path:
114b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        # Filter out duplicate paths (on case-insensitive file systems also
115b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        # if they only differ in case); turn relative paths into absolute
116b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        # paths.
117b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        dir, dircase = makepath(dir)
118b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        if not dircase in known_paths:
119b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            L.append(dir)
120b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            known_paths.add(dircase)
121b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    sys.path[:] = L
122b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    return known_paths
123b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
124b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
125b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef _init_pathinfo():
126b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Return a set containing all existing directory entries from sys.path"""
127b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    d = set()
128b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    for dir in sys.path:
129b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        try:
130b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            if os.path.isdir(dir):
131b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                dir, dircase = makepath(dir)
132b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                d.add(dircase)
133b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        except TypeError:
134b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            continue
135b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    return d
136b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
137b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
138b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef addpackage(sitedir, name, known_paths):
139b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Process a .pth file within the site-packages directory:
140b410d6e4ce58c177569d42b51772f7bb239a24a3darylm       For each line in the file, either combine it with sitedir to a path
141b410d6e4ce58c177569d42b51772f7bb239a24a3darylm       and add that to known_paths, or execute it if it starts with 'import '.
142b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """
143b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if known_paths is None:
144b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        _init_pathinfo()
145b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        reset = 1
146b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    else:
147b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        reset = 0
148b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    fullname = os.path.join(sitedir, name)
149b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    try:
150b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        f = open(fullname, "rU")
151b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    except IOError:
152b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        return
153b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    with f:
154b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        for n, line in enumerate(f):
155b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            if line.startswith("#"):
156b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                continue
157b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            try:
158b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                if line.startswith(("import ", "import\t")):
159b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    exec line
160b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    continue
161b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                line = line.rstrip()
162b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                dir, dircase = makepath(sitedir, line)
163b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                if not dircase in known_paths and os.path.exists(dir):
164b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    sys.path.append(dir)
165b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    known_paths.add(dircase)
166b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            except Exception as err:
167b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                print >>sys.stderr, "Error processing line {:d} of {}:\n".format(
168b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    n+1, fullname)
169b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                for record in traceback.format_exception(*sys.exc_info()):
170b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    for line in record.splitlines():
171b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                        print >>sys.stderr, '  '+line
172b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                print >>sys.stderr, "\nRemainder of file ignored"
173b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                break
174b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if reset:
175b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        known_paths = None
176b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    return known_paths
177b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
178b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
179b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef addsitedir(sitedir, known_paths=None):
180b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
181b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    'sitedir'"""
182b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if known_paths is None:
183b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        known_paths = _init_pathinfo()
184b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        reset = 1
185b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    else:
186b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        reset = 0
187b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    sitedir, sitedircase = makepath(sitedir)
188b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if not sitedircase in known_paths:
189b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        sys.path.append(sitedir)        # Add path component
190b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    try:
191b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        names = os.listdir(sitedir)
192b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    except os.error:
193b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        return
194b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    dotpth = os.extsep + "pth"
195b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    names = [name for name in names if name.endswith(dotpth)]
196b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    for name in sorted(names):
197b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        addpackage(sitedir, name, known_paths)
198b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if reset:
199b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        known_paths = None
200b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    return known_paths
201b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
202b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
203b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef check_enableusersite():
204b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Check if user site directory is safe for inclusion
205b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
206b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    The function tests for the command line flag (including environment var),
207b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    process uid/gid equal to effective uid/gid.
208b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
209b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    None: Disabled for security reasons
210b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    False: Disabled by user (command line option)
211b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    True: Safe and enabled
212b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """
213b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if sys.flags.no_user_site:
214b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        return False
215b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
216b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if hasattr(os, "getuid") and hasattr(os, "geteuid"):
217b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        # check process uid == effective uid
218b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        if os.geteuid() != os.getuid():
219b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            return None
220b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if hasattr(os, "getgid") and hasattr(os, "getegid"):
221b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        # check process gid == effective gid
222b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        if os.getegid() != os.getgid():
223b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            return None
224b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
225b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    return True
226b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
227b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef getuserbase():
228b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Returns the `user base` directory path.
229b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
230b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    The `user base` directory can be used to store data. If the global
231b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    variable ``USER_BASE`` is not initialized yet, this function will also set
232b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    it.
233b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """
234b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    global USER_BASE
235b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if USER_BASE is not None:
236b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        return USER_BASE
237b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    from sysconfig import get_config_var
238b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    USER_BASE = get_config_var('userbase')
239b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    return USER_BASE
240b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
241b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef getusersitepackages():
242b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Returns the user-specific site-packages directory path.
243b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
244b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    If the global variable ``USER_SITE`` is not initialized yet, this
245b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    function will also set it.
246b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """
247b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    global USER_SITE
248b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    user_base = getuserbase() # this will also set USER_BASE
249b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
250b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if USER_SITE is not None:
251b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        return USER_SITE
252b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
253b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    from sysconfig import get_path
254b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    import os
255b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
256b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    USER_SITE = get_path('purelib', '%s_user' % os.name)
257b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    return USER_SITE
258b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
259b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef addusersitepackages(known_paths):
260b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Add a per user site-package to sys.path
261b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
262b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    Each user has its own python directory with site-packages in the
263b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    home directory.
264b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """
265b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    # get the per user site-package path
266b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    # this call will also make sure USER_BASE and USER_SITE are set
267b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    user_site = getusersitepackages()
268b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
269b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if ENABLE_USER_SITE and os.path.isdir(user_site):
270b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        addsitedir(user_site, known_paths)
271b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    return known_paths
272b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
273b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef getsitepackages():
274b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Returns a list containing all global site-packages directories
275b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    (and possibly site-python).
276b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
277b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    For each directory present in the global ``PREFIXES``, this function
278b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    will find its `site-packages` subdirectory depending on the system
279b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    environment, and will return a list of full paths.
280b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """
281b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    sitepackages = []
282b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    seen = set()
283b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
284b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    for prefix in PREFIXES:
285b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        if not prefix or prefix in seen:
286b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            continue
287b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        seen.add(prefix)
288b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
289b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        sitepackages.append(os.path.join(prefix, "lib",
290b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                                    "python." + sys.version[0] + sys.version[2],
291b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                                    "site-packages"))
292b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        sitepackages.append(os.path.join(prefix, "lib", "site-python"))
293b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    return sitepackages
294b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
295b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef addsitepackages(known_paths):
296b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Add site-packages (and possibly site-python) to sys.path"""
297b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    for sitedir in getsitepackages():
298b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        if os.path.isdir(sitedir):
299b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            addsitedir(sitedir, known_paths)
300b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
301b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    return known_paths
302b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
303b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef setBEGINLIBPATH():
304b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """The UEFI port has optional extension modules that do double duty
305b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    as DLLs (even though they have .efi file extensions) for other extensions.
306b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    The library search path needs to be amended so these will be found
307b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    during module import.  Use BEGINLIBPATH so that these are at the start
308b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    of the library search path.
309b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
310b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """
311b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
312b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    libpath = os.environ['BEGINLIBPATH'].split(os.path.pathsep)
313b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if libpath[-1]:
314b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        libpath.append(dllpath)
315b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    else:
316b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        libpath[-1] = dllpath
317b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    os.environ['BEGINLIBPATH'] = os.path.pathsep.join(libpath)
318b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
319b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
320b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef setquit():
321b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Define new builtins 'quit' and 'exit'.
322b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
323b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    These are objects which make the interpreter exit when called.
324b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    The repr of each object contains a hint at how it works.
325b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
326b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """
327b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    eof = 'Ctrl-D (i.e. EOF)'
328b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
329b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    class Quitter(object):
330b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        def __init__(self, name):
331b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            self.name = name
332b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        def __repr__(self):
333b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            return 'Use %s() or %s to exit' % (self.name, eof)
334b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        def __call__(self, code=None):
335b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            # Shells like IDLE catch the SystemExit, but listen when their
336b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            # stdin wrapper is closed.
337b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            try:
338b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                sys.stdin.close()
339b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            except:
340b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                pass
341b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            raise SystemExit(code)
342b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    __builtin__.quit = Quitter('quit')
343b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    __builtin__.exit = Quitter('exit')
344b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
345b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
346b410d6e4ce58c177569d42b51772f7bb239a24a3darylmclass _Printer(object):
347b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """interactive prompt objects for printing the license text, a list of
348b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    contributors and the copyright notice."""
349b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
350b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    MAXLINES = 23
351b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
352b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    def __init__(self, name, data, files=(), dirs=()):
353b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        self.__name = name
354b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        self.__data = data
355b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        self.__files = files
356b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        self.__dirs = dirs
357b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        self.__lines = None
358b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
359b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    def __setup(self):
360b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        if self.__lines:
361b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            return
362b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        data = None
363b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        for dir in self.__dirs:
364b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            for filename in self.__files:
365b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                filename = os.path.join(dir, filename)
366b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                try:
367b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    fp = file(filename, "rU")
368b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    data = fp.read()
369b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    fp.close()
370b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    break
371b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                except IOError:
372b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    pass
373b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            if data:
374b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                break
375b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        if not data:
376b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            data = self.__data
377b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        self.__lines = data.split('\n')
378b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        self.__linecnt = len(self.__lines)
379b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
380b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    def __repr__(self):
381b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        self.__setup()
382b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        if len(self.__lines) <= self.MAXLINES:
383b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            return "\n".join(self.__lines)
384b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        else:
385b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            return "Type %s() to see the full %s text" % ((self.__name,)*2)
386b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
387b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    def __call__(self):
388b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        self.__setup()
389b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        prompt = 'Hit Return for more, or q (and Return) to quit: '
390b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        lineno = 0
391b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        while 1:
392b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            try:
393b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                for i in range(lineno, lineno + self.MAXLINES):
394b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    print self.__lines[i]
395b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            except IndexError:
396b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                break
397b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            else:
398b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                lineno += self.MAXLINES
399b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                key = None
400b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                while key is None:
401b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    key = raw_input(prompt)
402b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    if key not in ('', 'q'):
403b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                        key = None
404b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                if key == 'q':
405b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                    break
406b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
407b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef setcopyright():
408b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Set 'copyright' and 'credits' in __builtin__"""
409b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    __builtin__.copyright = _Printer("copyright", sys.copyright)
410b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    __builtin__.credits = _Printer("credits", """\
411b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
412b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    for supporting Python development.  See www.python.org for more information.""")
413b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    here = os.path.dirname(os.__file__)
414b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    __builtin__.license = _Printer(
415b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
416b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        ["LICENSE.txt", "LICENSE"],
417b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        [os.path.join(here, os.pardir), here, os.curdir])
418b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
419b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
420b410d6e4ce58c177569d42b51772f7bb239a24a3darylmclass _Helper(object):
421b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Define the builtin 'help'.
422b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    This is a wrapper around pydoc.help (with a twist).
423b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
424b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """
425b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
426b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    def __repr__(self):
427b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        return "Type help() for interactive help, " \
428b410d6e4ce58c177569d42b51772f7bb239a24a3darylm               "or help(object) for help about object."
429b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
430b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    def __call__(self, *args, **kwds):
431b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        import pydoc
432b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        return pydoc.help(*args, **kwds)
433b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
434b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef sethelper():
435b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    __builtin__.help = _Helper()
436b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
437b410d6e4ce58c177569d42b51772f7bb239a24a3darylm####
438b410d6e4ce58c177569d42b51772f7bb239a24a3darylm# Keep around for future mbcs support.
439b410d6e4ce58c177569d42b51772f7bb239a24a3darylm####
440b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#def aliasmbcs():
441b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#    """On Windows, some default encodings are not provided by Python,
442b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#    while they are always available as "mbcs" in each locale. Make
443b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#    them usable by aliasing to "mbcs" in such a case."""
444b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#    if sys.platform == 'win32':
445b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#        import locale, codecs
446b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#        enc = locale.getdefaultlocale()[1]
447b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#        if enc.startswith('cp'):            # "cp***" ?
448b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#            try:
449b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#                codecs.lookup(enc)
450b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#            except LookupError:
451b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#                import encodings
452b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#                encodings._cache[enc] = encodings._unknown
453b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#                encodings.aliases.aliases[enc] = 'mbcs'
454b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
455b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef setencoding():
456b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Set the string encoding used by the Unicode implementation.  The
457b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    default is 'ascii', but if you're willing to experiment, you can
458b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    change this."""
459b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    encoding = "ascii" # Default value set by _PyUnicode_Init()
460b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if 0:
461b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        # Enable to support locale aware default string encodings.
462b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        import locale
463b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        loc = locale.getdefaultlocale()
464b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        if loc[1]:
465b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            encoding = loc[1]
466b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if 0:
467b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        # Enable to switch off string to Unicode coercion and implicit
468b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        # Unicode to string conversion.
469b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        encoding = "undefined"
470b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if encoding != "ascii":
471b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        # On Non-Unicode builds this will raise an AttributeError...
472b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
473b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
474b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
475b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef execsitecustomize():
476b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Run custom site specific code, if available."""
477b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    try:
478b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        import sitecustomize
479b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    except ImportError:
480b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        pass
481b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    except Exception:
482b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        if sys.flags.verbose:
483b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            sys.excepthook(*sys.exc_info())
484b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        else:
485b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            print >>sys.stderr, \
486b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                "'import sitecustomize' failed; use -v for traceback"
487b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
488b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
489b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef execusercustomize():
490b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """Run custom user specific code, if available."""
491b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    try:
492b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        import usercustomize
493b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    except ImportError:
494b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        pass
495b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    except Exception:
496b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        if sys.flags.verbose:
497b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            sys.excepthook(*sys.exc_info())
498b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        else:
499b410d6e4ce58c177569d42b51772f7bb239a24a3darylm            print>>sys.stderr, \
500b410d6e4ce58c177569d42b51772f7bb239a24a3darylm                "'import usercustomize' failed; use -v for traceback"
501b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
502b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
503b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef main():
504b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    abs__file__()
505b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    known_paths = removeduppaths()
5063b553e0ab2146ef2055c969a1893b453b2023cf4darylm    known_paths = addsitepackages(known_paths)
507b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    setquit()
508b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    setcopyright()
509b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    sethelper()
510b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#    aliasmbcs()
511b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    setencoding()
512b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    execsitecustomize()
513b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    # Remove sys.setdefaultencoding() so that users cannot change the
514b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    # encoding after initialization.  The test for presence is needed when
515b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    # this module is run as a script, because this code is executed twice.
516b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    if hasattr(sys, "setdefaultencoding"):
517b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        del sys.setdefaultencoding
518b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
519b410d6e4ce58c177569d42b51772f7bb239a24a3darylmmain()
520b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
521b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdef _script():
522b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    help = """\
523b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    %s
524b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
525b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    Path elements are normally separated by '%s'.
526b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    """
527b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    print "sys.path = ["
528b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    for dir in sys.path:
529b410d6e4ce58c177569d42b51772f7bb239a24a3darylm        print "    %r," % (dir,)
530b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    print "]"
531b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
532b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    import textwrap
533b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    print textwrap.dedent(help % (sys.argv[0], os.pathsep))
534b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    sys.exit(0)
535b410d6e4ce58c177569d42b51772f7bb239a24a3darylm
536b410d6e4ce58c177569d42b51772f7bb239a24a3darylmif __name__ == '__main__':
537b410d6e4ce58c177569d42b51772f7bb239a24a3darylm    _script()
538