1"""Append module search paths for third-party packages to sys.path.
2
3****************************************************************
4* This module is automatically imported during initialization. *
5****************************************************************
6
7In earlier versions of Python (up to 1.5a3), scripts or modules that
8needed to use site-specific modules would place ``import site''
9somewhere near the top of their code.  Because of the automatic
10import, this is no longer necessary (but code that does it still
11works).
12
13This will append site-specific paths to the module search path.  On
14Unix, it starts with sys.prefix and sys.exec_prefix (if different) and
15appends lib/python<version>/site-packages as well as lib/site-python.
16It also supports the Debian convention of
17lib/python<version>/dist-packages.  On other platforms (mainly Mac and
18Windows), it uses just sys.prefix (and sys.exec_prefix, if different,
19but this is unlikely).  The resulting directories, if they exist, are
20appended to sys.path, and also inspected for path configuration files.
21
22FOR DEBIAN, this sys.path is augmented with directories in /usr/local.
23Local addons go into /usr/local/lib/python<version>/site-packages
24(resp. /usr/local/lib/site-python), Debian addons install into
25/usr/{lib,share}/python<version>/dist-packages.
26
27A path configuration file is a file whose name has the form
28<package>.pth; its contents are additional directories (one per line)
29to be added to sys.path.  Non-existing directories (or
30non-directories) are never added to sys.path; no directory is added to
31sys.path more than once.  Blank lines and lines beginning with
32'#' are skipped. Lines starting with 'import' are executed.
33
34For example, suppose sys.prefix and sys.exec_prefix are set to
35/usr/local and there is a directory /usr/local/lib/python2.X/site-packages
36with three subdirectories, foo, bar and spam, and two path
37configuration files, foo.pth and bar.pth.  Assume foo.pth contains the
38following:
39
40  # foo package configuration
41  foo
42  bar
43  bletch
44
45and bar.pth contains:
46
47  # bar package configuration
48  bar
49
50Then the following directories are added to sys.path, in this order:
51
52  /usr/local/lib/python2.X/site-packages/bar
53  /usr/local/lib/python2.X/site-packages/foo
54
55Note that bletch is omitted because it doesn't exist; bar precedes foo
56because bar.pth comes alphabetically before foo.pth; and spam is
57omitted because it is not mentioned in either path configuration file.
58
59After these path manipulations, an attempt is made to import a module
60named sitecustomize, which can perform arbitrary additional
61site-specific customizations.  If this import fails with an
62ImportError exception, it is silently ignored.
63
64"""
65
66import sys
67import os
68try:
69    import __builtin__ as builtins
70except ImportError:
71    import builtins
72try:
73    set
74except NameError:
75    from sets import Set as set
76
77# Prefixes for site-packages; add additional prefixes like /usr/local here
78PREFIXES = [sys.prefix, sys.exec_prefix]
79# Enable per user site-packages directory
80# set it to False to disable the feature or True to force the feature
81ENABLE_USER_SITE = None
82# for distutils.commands.install
83USER_SITE = None
84USER_BASE = None
85
86_is_64bit = (getattr(sys, 'maxsize', None) or getattr(sys, 'maxint')) > 2**32
87_is_pypy = hasattr(sys, 'pypy_version_info')
88_is_jython = sys.platform[:4] == 'java'
89if _is_jython:
90    ModuleType = type(os)
91
92def makepath(*paths):
93    dir = os.path.join(*paths)
94    if _is_jython and (dir == '__classpath__' or
95                       dir.startswith('__pyclasspath__')):
96        return dir, dir
97    dir = os.path.abspath(dir)
98    return dir, os.path.normcase(dir)
99
100def abs__file__():
101    """Set all module' __file__ attribute to an absolute path"""
102    for m in sys.modules.values():
103        if ((_is_jython and not isinstance(m, ModuleType)) or
104            hasattr(m, '__loader__')):
105            # only modules need the abspath in Jython. and don't mess
106            # with a PEP 302-supplied __file__
107            continue
108        f = getattr(m, '__file__', None)
109        if f is None:
110            continue
111        m.__file__ = os.path.abspath(f)
112
113def removeduppaths():
114    """ Remove duplicate entries from sys.path along with making them
115    absolute"""
116    # This ensures that the initial path provided by the interpreter contains
117    # only absolute pathnames, even if we're running from the build directory.
118    L = []
119    known_paths = set()
120    for dir in sys.path:
121        # Filter out duplicate paths (on case-insensitive file systems also
122        # if they only differ in case); turn relative paths into absolute
123        # paths.
124        dir, dircase = makepath(dir)
125        if not dircase in known_paths:
126            L.append(dir)
127            known_paths.add(dircase)
128    sys.path[:] = L
129    return known_paths
130
131# XXX This should not be part of site.py, since it is needed even when
132# using the -S option for Python.  See http://www.python.org/sf/586680
133def addbuilddir():
134    """Append ./build/lib.<platform> in case we're running in the build dir
135    (especially for Guido :-)"""
136    from distutils.util import get_platform
137    s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
138    if hasattr(sys, 'gettotalrefcount'):
139        s += '-pydebug'
140    s = os.path.join(os.path.dirname(sys.path[-1]), s)
141    sys.path.append(s)
142
143def _init_pathinfo():
144    """Return a set containing all existing directory entries from sys.path"""
145    d = set()
146    for dir in sys.path:
147        try:
148            if os.path.isdir(dir):
149                dir, dircase = makepath(dir)
150                d.add(dircase)
151        except TypeError:
152            continue
153    return d
154
155def addpackage(sitedir, name, known_paths):
156    """Add a new path to known_paths by combining sitedir and 'name' or execute
157    sitedir if it starts with 'import'"""
158    if known_paths is None:
159        _init_pathinfo()
160        reset = 1
161    else:
162        reset = 0
163    fullname = os.path.join(sitedir, name)
164    try:
165        f = open(fullname, "rU")
166    except IOError:
167        return
168    try:
169        for line in f:
170            if line.startswith("#"):
171                continue
172            if line.startswith("import"):
173                exec(line)
174                continue
175            line = line.rstrip()
176            dir, dircase = makepath(sitedir, line)
177            if not dircase in known_paths and os.path.exists(dir):
178                sys.path.append(dir)
179                known_paths.add(dircase)
180    finally:
181        f.close()
182    if reset:
183        known_paths = None
184    return known_paths
185
186def addsitedir(sitedir, known_paths=None):
187    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
188    'sitedir'"""
189    if known_paths is None:
190        known_paths = _init_pathinfo()
191        reset = 1
192    else:
193        reset = 0
194    sitedir, sitedircase = makepath(sitedir)
195    if not sitedircase in known_paths:
196        sys.path.append(sitedir)        # Add path component
197    try:
198        names = os.listdir(sitedir)
199    except os.error:
200        return
201    names.sort()
202    for name in names:
203        if name.endswith(os.extsep + "pth"):
204            addpackage(sitedir, name, known_paths)
205    if reset:
206        known_paths = None
207    return known_paths
208
209def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix):
210    """Add site-packages (and possibly site-python) to sys.path"""
211    prefixes = [os.path.join(sys_prefix, "local"), sys_prefix]
212    if exec_prefix != sys_prefix:
213        prefixes.append(os.path.join(exec_prefix, "local"))
214
215    for prefix in prefixes:
216        if prefix:
217            if sys.platform in ('os2emx', 'riscos') or _is_jython:
218                sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
219            elif _is_pypy:
220                sitedirs = [os.path.join(prefix, 'site-packages')]
221            elif sys.platform == 'darwin' and prefix == sys_prefix:
222
223                if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python
224
225                    sitedirs = [os.path.join("/Library/Python", sys.version[:3], "site-packages"),
226                                os.path.join(prefix, "Extras", "lib", "python")]
227
228                else: # any other Python distros on OSX work this way
229                    sitedirs = [os.path.join(prefix, "lib",
230                                             "python" + sys.version[:3], "site-packages")]
231
232            elif os.sep == '/':
233                sitedirs = [os.path.join(prefix,
234                                         "lib",
235                                         "python" + sys.version[:3],
236                                         "site-packages"),
237                            os.path.join(prefix, "lib", "site-python"),
238                            os.path.join(prefix, "python" + sys.version[:3], "lib-dynload")]
239                lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages")
240                if (os.path.exists(lib64_dir) and
241                    os.path.realpath(lib64_dir) not in [os.path.realpath(p) for p in sitedirs]):
242                    if _is_64bit:
243                        sitedirs.insert(0, lib64_dir)
244                    else:
245                        sitedirs.append(lib64_dir)
246                try:
247                    # sys.getobjects only available in --with-pydebug build
248                    sys.getobjects
249                    sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
250                except AttributeError:
251                    pass
252                # Debian-specific dist-packages directories:
253                sitedirs.append(os.path.join(prefix, "local/lib",
254                                             "python" + sys.version[:3],
255                                             "dist-packages"))
256                if sys.version[0] == '2':
257                    sitedirs.append(os.path.join(prefix, "lib",
258                                                 "python" + sys.version[:3],
259                                                 "dist-packages"))
260                else:
261                    sitedirs.append(os.path.join(prefix, "lib",
262                                                 "python" + sys.version[0],
263                                                 "dist-packages"))
264                sitedirs.append(os.path.join(prefix, "lib", "dist-python"))
265            else:
266                sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
267            if sys.platform == 'darwin':
268                # for framework builds *only* we add the standard Apple
269                # locations. Currently only per-user, but /Library and
270                # /Network/Library could be added too
271                if 'Python.framework' in prefix:
272                    home = os.environ.get('HOME')
273                    if home:
274                        sitedirs.append(
275                            os.path.join(home,
276                                         'Library',
277                                         'Python',
278                                         sys.version[:3],
279                                         'site-packages'))
280            for sitedir in sitedirs:
281                if os.path.isdir(sitedir):
282                    addsitedir(sitedir, known_paths)
283    return None
284
285def check_enableusersite():
286    """Check if user site directory is safe for inclusion
287
288    The function tests for the command line flag (including environment var),
289    process uid/gid equal to effective uid/gid.
290
291    None: Disabled for security reasons
292    False: Disabled by user (command line option)
293    True: Safe and enabled
294    """
295    if hasattr(sys, 'flags') and getattr(sys.flags, 'no_user_site', False):
296        return False
297
298    if hasattr(os, "getuid") and hasattr(os, "geteuid"):
299        # check process uid == effective uid
300        if os.geteuid() != os.getuid():
301            return None
302    if hasattr(os, "getgid") and hasattr(os, "getegid"):
303        # check process gid == effective gid
304        if os.getegid() != os.getgid():
305            return None
306
307    return True
308
309def addusersitepackages(known_paths):
310    """Add a per user site-package to sys.path
311
312    Each user has its own python directory with site-packages in the
313    home directory.
314
315    USER_BASE is the root directory for all Python versions
316
317    USER_SITE is the user specific site-packages directory
318
319    USER_SITE/.. can be used for data.
320    """
321    global USER_BASE, USER_SITE, ENABLE_USER_SITE
322    env_base = os.environ.get("PYTHONUSERBASE", None)
323
324    def joinuser(*args):
325        return os.path.expanduser(os.path.join(*args))
326
327    #if sys.platform in ('os2emx', 'riscos'):
328    #    # Don't know what to put here
329    #    USER_BASE = ''
330    #    USER_SITE = ''
331    if os.name == "nt":
332        base = os.environ.get("APPDATA") or "~"
333        if env_base:
334            USER_BASE = env_base
335        else:
336            USER_BASE = joinuser(base, "Python")
337        USER_SITE = os.path.join(USER_BASE,
338                                 "Python" + sys.version[0] + sys.version[2],
339                                 "site-packages")
340    else:
341        if env_base:
342            USER_BASE = env_base
343        else:
344            USER_BASE = joinuser("~", ".local")
345        USER_SITE = os.path.join(USER_BASE, "lib",
346                                 "python" + sys.version[:3],
347                                 "site-packages")
348
349    if ENABLE_USER_SITE and os.path.isdir(USER_SITE):
350        addsitedir(USER_SITE, known_paths)
351    if ENABLE_USER_SITE:
352        for dist_libdir in ("lib", "local/lib"):
353            user_site = os.path.join(USER_BASE, dist_libdir,
354                                     "python" + sys.version[:3],
355                                     "dist-packages")
356            if os.path.isdir(user_site):
357                addsitedir(user_site, known_paths)
358    return known_paths
359
360
361
362def setBEGINLIBPATH():
363    """The OS/2 EMX port has optional extension modules that do double duty
364    as DLLs (and must use the .DLL file extension) for other extensions.
365    The library search path needs to be amended so these will be found
366    during module import.  Use BEGINLIBPATH so that these are at the start
367    of the library search path.
368
369    """
370    dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
371    libpath = os.environ['BEGINLIBPATH'].split(';')
372    if libpath[-1]:
373        libpath.append(dllpath)
374    else:
375        libpath[-1] = dllpath
376    os.environ['BEGINLIBPATH'] = ';'.join(libpath)
377
378
379def setquit():
380    """Define new built-ins 'quit' and 'exit'.
381    These are simply strings that display a hint on how to exit.
382
383    """
384    if os.sep == ':':
385        eof = 'Cmd-Q'
386    elif os.sep == '\\':
387        eof = 'Ctrl-Z plus Return'
388    else:
389        eof = 'Ctrl-D (i.e. EOF)'
390
391    class Quitter(object):
392        def __init__(self, name):
393            self.name = name
394        def __repr__(self):
395            return 'Use %s() or %s to exit' % (self.name, eof)
396        def __call__(self, code=None):
397            # Shells like IDLE catch the SystemExit, but listen when their
398            # stdin wrapper is closed.
399            try:
400                sys.stdin.close()
401            except:
402                pass
403            raise SystemExit(code)
404    builtins.quit = Quitter('quit')
405    builtins.exit = Quitter('exit')
406
407
408class _Printer(object):
409    """interactive prompt objects for printing the license text, a list of
410    contributors and the copyright notice."""
411
412    MAXLINES = 23
413
414    def __init__(self, name, data, files=(), dirs=()):
415        self.__name = name
416        self.__data = data
417        self.__files = files
418        self.__dirs = dirs
419        self.__lines = None
420
421    def __setup(self):
422        if self.__lines:
423            return
424        data = None
425        for dir in self.__dirs:
426            for filename in self.__files:
427                filename = os.path.join(dir, filename)
428                try:
429                    fp = open(filename, "rU")
430                    data = fp.read()
431                    fp.close()
432                    break
433                except IOError:
434                    pass
435            if data:
436                break
437        if not data:
438            data = self.__data
439        self.__lines = data.split('\n')
440        self.__linecnt = len(self.__lines)
441
442    def __repr__(self):
443        self.__setup()
444        if len(self.__lines) <= self.MAXLINES:
445            return "\n".join(self.__lines)
446        else:
447            return "Type %s() to see the full %s text" % ((self.__name,)*2)
448
449    def __call__(self):
450        self.__setup()
451        prompt = 'Hit Return for more, or q (and Return) to quit: '
452        lineno = 0
453        while 1:
454            try:
455                for i in range(lineno, lineno + self.MAXLINES):
456                    print(self.__lines[i])
457            except IndexError:
458                break
459            else:
460                lineno += self.MAXLINES
461                key = None
462                while key is None:
463                    try:
464                        key = raw_input(prompt)
465                    except NameError:
466                        key = input(prompt)
467                    if key not in ('', 'q'):
468                        key = None
469                if key == 'q':
470                    break
471
472def setcopyright():
473    """Set 'copyright' and 'credits' in __builtin__"""
474    builtins.copyright = _Printer("copyright", sys.copyright)
475    if _is_jython:
476        builtins.credits = _Printer(
477            "credits",
478            "Jython is maintained by the Jython developers (www.jython.org).")
479    elif _is_pypy:
480        builtins.credits = _Printer(
481            "credits",
482            "PyPy is maintained by the PyPy developers: http://pypy.org/")
483    else:
484        builtins.credits = _Printer("credits", """\
485    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
486    for supporting Python development.  See www.python.org for more information.""")
487    here = os.path.dirname(os.__file__)
488    builtins.license = _Printer(
489        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
490        ["LICENSE.txt", "LICENSE"],
491        [os.path.join(here, os.pardir), here, os.curdir])
492
493
494class _Helper(object):
495    """Define the built-in 'help'.
496    This is a wrapper around pydoc.help (with a twist).
497
498    """
499
500    def __repr__(self):
501        return "Type help() for interactive help, " \
502               "or help(object) for help about object."
503    def __call__(self, *args, **kwds):
504        import pydoc
505        return pydoc.help(*args, **kwds)
506
507def sethelper():
508    builtins.help = _Helper()
509
510def aliasmbcs():
511    """On Windows, some default encodings are not provided by Python,
512    while they are always available as "mbcs" in each locale. Make
513    them usable by aliasing to "mbcs" in such a case."""
514    if sys.platform == 'win32':
515        import locale, codecs
516        enc = locale.getdefaultlocale()[1]
517        if enc.startswith('cp'):            # "cp***" ?
518            try:
519                codecs.lookup(enc)
520            except LookupError:
521                import encodings
522                encodings._cache[enc] = encodings._unknown
523                encodings.aliases.aliases[enc] = 'mbcs'
524
525def setencoding():
526    """Set the string encoding used by the Unicode implementation.  The
527    default is 'ascii', but if you're willing to experiment, you can
528    change this."""
529    encoding = "ascii" # Default value set by _PyUnicode_Init()
530    if 0:
531        # Enable to support locale aware default string encodings.
532        import locale
533        loc = locale.getdefaultlocale()
534        if loc[1]:
535            encoding = loc[1]
536    if 0:
537        # Enable to switch off string to Unicode coercion and implicit
538        # Unicode to string conversion.
539        encoding = "undefined"
540    if encoding != "ascii":
541        # On Non-Unicode builds this will raise an AttributeError...
542        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
543
544
545def execsitecustomize():
546    """Run custom site specific code, if available."""
547    try:
548        import sitecustomize
549    except ImportError:
550        pass
551
552def virtual_install_main_packages():
553    f = open(os.path.join(os.path.dirname(__file__), 'orig-prefix.txt'))
554    sys.real_prefix = f.read().strip()
555    f.close()
556    pos = 2
557    hardcoded_relative_dirs = []
558    if sys.path[0] == '':
559        pos += 1
560    if _is_jython:
561        paths = [os.path.join(sys.real_prefix, 'Lib')]
562    elif _is_pypy:
563        if sys.version_info > (3, 2):
564            cpyver = '%d' % sys.version_info[0]
565        elif sys.pypy_version_info >= (1, 5):
566            cpyver = '%d.%d' % sys.version_info[:2]
567        else:
568            cpyver = '%d.%d.%d' % sys.version_info[:3]
569        paths = [os.path.join(sys.real_prefix, 'lib_pypy'),
570                 os.path.join(sys.real_prefix, 'lib-python', cpyver)]
571        if sys.pypy_version_info < (1, 9):
572            paths.insert(1, os.path.join(sys.real_prefix,
573                                         'lib-python', 'modified-%s' % cpyver))
574        hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below
575        #
576        # This is hardcoded in the Python executable, but relative to sys.prefix:
577        for path in paths[:]:
578            plat_path = os.path.join(path, 'plat-%s' % sys.platform)
579            if os.path.exists(plat_path):
580                paths.append(plat_path)
581    elif sys.platform == 'win32':
582        paths = [os.path.join(sys.real_prefix, 'Lib'), os.path.join(sys.real_prefix, 'DLLs')]
583    else:
584        paths = [os.path.join(sys.real_prefix, 'lib', 'python'+sys.version[:3])]
585        hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below
586        lib64_path = os.path.join(sys.real_prefix, 'lib64', 'python'+sys.version[:3])
587        if os.path.exists(lib64_path):
588            if _is_64bit:
589                paths.insert(0, lib64_path)
590            else:
591                paths.append(lib64_path)
592        # This is hardcoded in the Python executable, but relative to
593        # sys.prefix.  Debian change: we need to add the multiarch triplet
594        # here, which is where the real stuff lives.  As per PEP 421, in
595        # Python 3.3+, this lives in sys.implementation, while in Python 2.7
596        # it lives in sys.
597        try:
598            arch = getattr(sys, 'implementation', sys)._multiarch
599        except AttributeError:
600            # This is a non-multiarch aware Python.  Fallback to the old way.
601            arch = sys.platform
602        plat_path = os.path.join(sys.real_prefix, 'lib',
603                                 'python'+sys.version[:3],
604                                 'plat-%s' % arch)
605        if os.path.exists(plat_path):
606            paths.append(plat_path)
607    # This is hardcoded in the Python executable, but
608    # relative to sys.prefix, so we have to fix up:
609    for path in list(paths):
610        tk_dir = os.path.join(path, 'lib-tk')
611        if os.path.exists(tk_dir):
612            paths.append(tk_dir)
613
614    # These are hardcoded in the Apple's Python executable,
615    # but relative to sys.prefix, so we have to fix them up:
616    if sys.platform == 'darwin':
617        hardcoded_paths = [os.path.join(relative_dir, module)
618                           for relative_dir in hardcoded_relative_dirs
619                           for module in ('plat-darwin', 'plat-mac', 'plat-mac/lib-scriptpackages')]
620
621        for path in hardcoded_paths:
622            if os.path.exists(path):
623                paths.append(path)
624
625    sys.path.extend(paths)
626
627def force_global_eggs_after_local_site_packages():
628    """
629    Force easy_installed eggs in the global environment to get placed
630    in sys.path after all packages inside the virtualenv.  This
631    maintains the "least surprise" result that packages in the
632    virtualenv always mask global packages, never the other way
633    around.
634
635    """
636    egginsert = getattr(sys, '__egginsert', 0)
637    for i, path in enumerate(sys.path):
638        if i > egginsert and path.startswith(sys.prefix):
639            egginsert = i
640    sys.__egginsert = egginsert + 1
641
642def virtual_addsitepackages(known_paths):
643    force_global_eggs_after_local_site_packages()
644    return addsitepackages(known_paths, sys_prefix=sys.real_prefix)
645
646def fixclasspath():
647    """Adjust the special classpath sys.path entries for Jython. These
648    entries should follow the base virtualenv lib directories.
649    """
650    paths = []
651    classpaths = []
652    for path in sys.path:
653        if path == '__classpath__' or path.startswith('__pyclasspath__'):
654            classpaths.append(path)
655        else:
656            paths.append(path)
657    sys.path = paths
658    sys.path.extend(classpaths)
659
660def execusercustomize():
661    """Run custom user specific code, if available."""
662    try:
663        import usercustomize
664    except ImportError:
665        pass
666
667
668def main():
669    global ENABLE_USER_SITE
670    virtual_install_main_packages()
671    abs__file__()
672    paths_in_sys = removeduppaths()
673    if (os.name == "posix" and sys.path and
674        os.path.basename(sys.path[-1]) == "Modules"):
675        addbuilddir()
676    if _is_jython:
677        fixclasspath()
678    GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), 'no-global-site-packages.txt'))
679    if not GLOBAL_SITE_PACKAGES:
680        ENABLE_USER_SITE = False
681    if ENABLE_USER_SITE is None:
682        ENABLE_USER_SITE = check_enableusersite()
683    paths_in_sys = addsitepackages(paths_in_sys)
684    paths_in_sys = addusersitepackages(paths_in_sys)
685    if GLOBAL_SITE_PACKAGES:
686        paths_in_sys = virtual_addsitepackages(paths_in_sys)
687    if sys.platform == 'os2emx':
688        setBEGINLIBPATH()
689    setquit()
690    setcopyright()
691    sethelper()
692    aliasmbcs()
693    setencoding()
694    execsitecustomize()
695    if ENABLE_USER_SITE:
696        execusercustomize()
697    # Remove sys.setdefaultencoding() so that users cannot change the
698    # encoding after initialization.  The test for presence is needed when
699    # this module is run as a script, because this code is executed twice.
700    if hasattr(sys, "setdefaultencoding"):
701        del sys.setdefaultencoding
702
703main()
704
705def _script():
706    help = """\
707    %s [--user-base] [--user-site]
708
709    Without arguments print some useful information
710    With arguments print the value of USER_BASE and/or USER_SITE separated
711    by '%s'.
712
713    Exit codes with --user-base or --user-site:
714      0 - user site directory is enabled
715      1 - user site directory is disabled by user
716      2 - uses site directory is disabled by super user
717          or for security reasons
718     >2 - unknown error
719    """
720    args = sys.argv[1:]
721    if not args:
722        print("sys.path = [")
723        for dir in sys.path:
724            print("    %r," % (dir,))
725        print("]")
726        def exists(path):
727            if os.path.isdir(path):
728                return "exists"
729            else:
730                return "doesn't exist"
731        print("USER_BASE: %r (%s)" % (USER_BASE, exists(USER_BASE)))
732        print("USER_SITE: %r (%s)" % (USER_SITE, exists(USER_BASE)))
733        print("ENABLE_USER_SITE: %r" %  ENABLE_USER_SITE)
734        sys.exit(0)
735
736    buffer = []
737    if '--user-base' in args:
738        buffer.append(USER_BASE)
739    if '--user-site' in args:
740        buffer.append(USER_SITE)
741
742    if buffer:
743        print(os.pathsep.join(buffer))
744        if ENABLE_USER_SITE:
745            sys.exit(0)
746        elif ENABLE_USER_SITE is False:
747            sys.exit(1)
748        elif ENABLE_USER_SITE is None:
749            sys.exit(2)
750        else:
751            sys.exit(3)
752    else:
753        import textwrap
754        print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
755        sys.exit(10)
756
757if __name__ == '__main__':
758    _script()
759