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 os
67import sys
68
69try:
70    import __builtin__ as builtins
71except ImportError:
72    import builtins
73try:
74    set
75except NameError:
76    from sets import Set as set
77
78# Prefixes for site-packages; add additional prefixes like /usr/local here
79PREFIXES = [sys.prefix, sys.exec_prefix]
80# Enable per user site-packages directory
81# set it to False to disable the feature or True to force the feature
82ENABLE_USER_SITE = None
83# for distutils.commands.install
84USER_SITE = None
85USER_BASE = None
86
87_is_64bit = (getattr(sys, "maxsize", None) or getattr(sys, "maxint")) > 2 ** 32
88_is_pypy = hasattr(sys, "pypy_version_info")
89_is_jython = sys.platform[:4] == "java"
90if _is_jython:
91    ModuleType = type(os)
92
93
94def makepath(*paths):
95    dir = os.path.join(*paths)
96    if _is_jython and (dir == "__classpath__" or dir.startswith("__pyclasspath__")):
97        return dir, dir
98    dir = os.path.abspath(dir)
99    return dir, os.path.normcase(dir)
100
101
102def abs__file__():
103    """Set all module' __file__ attribute to an absolute path"""
104    for m in sys.modules.values():
105        if (_is_jython and not isinstance(m, ModuleType)) or hasattr(m, "__loader__"):
106            # only modules need the abspath in Jython. and don't mess
107            # with a PEP 302-supplied __file__
108            continue
109        f = getattr(m, "__file__", None)
110        if f is None:
111            continue
112        m.__file__ = os.path.abspath(f)
113
114
115def removeduppaths():
116    """ Remove duplicate entries from sys.path along with making them
117    absolute"""
118    # This ensures that the initial path provided by the interpreter contains
119    # only absolute pathnames, even if we're running from the build directory.
120    L = []
121    known_paths = set()
122    for dir in sys.path:
123        # Filter out duplicate paths (on case-insensitive file systems also
124        # if they only differ in case); turn relative paths into absolute
125        # paths.
126        dir, dircase = makepath(dir)
127        if not dircase in known_paths:
128            L.append(dir)
129            known_paths.add(dircase)
130    sys.path[:] = L
131    return known_paths
132
133
134# XXX This should not be part of site.py, since it is needed even when
135# using the -S option for Python.  See http://www.python.org/sf/586680
136def addbuilddir():
137    """Append ./build/lib.<platform> in case we're running in the build dir
138    (especially for Guido :-)"""
139    from distutils.util import get_platform
140
141    s = "build/lib.{}-{:.3}".format(get_platform(), sys.version)
142    if hasattr(sys, "gettotalrefcount"):
143        s += "-pydebug"
144    s = os.path.join(os.path.dirname(sys.path[-1]), s)
145    sys.path.append(s)
146
147
148def _init_pathinfo():
149    """Return a set containing all existing directory entries from sys.path"""
150    d = set()
151    for dir in sys.path:
152        try:
153            if os.path.isdir(dir):
154                dir, dircase = makepath(dir)
155                d.add(dircase)
156        except TypeError:
157            continue
158    return d
159
160
161def addpackage(sitedir, name, known_paths):
162    """Add a new path to known_paths by combining sitedir and 'name' or execute
163    sitedir if it starts with 'import'"""
164    if known_paths is None:
165        _init_pathinfo()
166        reset = 1
167    else:
168        reset = 0
169    fullname = os.path.join(sitedir, name)
170    try:
171        f = open(fullname, "r")
172    except IOError:
173        return
174    try:
175        for line in f:
176            if line.startswith("#"):
177                continue
178            if line.startswith("import"):
179                exec(line)
180                continue
181            line = line.rstrip()
182            dir, dircase = makepath(sitedir, line)
183            if not dircase in known_paths and os.path.exists(dir):
184                sys.path.append(dir)
185                known_paths.add(dircase)
186    finally:
187        f.close()
188    if reset:
189        known_paths = None
190    return known_paths
191
192
193def addsitedir(sitedir, known_paths=None):
194    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
195    'sitedir'"""
196    if known_paths is None:
197        known_paths = _init_pathinfo()
198        reset = 1
199    else:
200        reset = 0
201    sitedir, sitedircase = makepath(sitedir)
202    if not sitedircase in known_paths:
203        sys.path.append(sitedir)  # Add path component
204    try:
205        names = os.listdir(sitedir)
206    except os.error:
207        return
208    names.sort()
209    for name in names:
210        if name.endswith(os.extsep + "pth"):
211            addpackage(sitedir, name, known_paths)
212    if reset:
213        known_paths = None
214    return known_paths
215
216
217def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix):
218    """Add site-packages (and possibly site-python) to sys.path"""
219    prefixes = [os.path.join(sys_prefix, "local"), sys_prefix]
220    if exec_prefix != sys_prefix:
221        prefixes.append(os.path.join(exec_prefix, "local"))
222
223    for prefix in prefixes:
224        if prefix:
225            if sys.platform in ("os2emx", "riscos") or _is_jython:
226                sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
227            elif _is_pypy:
228                sitedirs = [os.path.join(prefix, "site-packages")]
229            elif sys.platform == "darwin" and prefix == sys_prefix:
230
231                if prefix.startswith("/System/Library/Frameworks/"):  # Apple's Python
232
233                    sitedirs = [
234                        os.path.join("/Library/Python", sys.version[:3], "site-packages"),
235                        os.path.join(prefix, "Extras", "lib", "python"),
236                    ]
237
238                else:  # any other Python distros on OSX work this way
239                    sitedirs = [os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages")]
240
241            elif os.sep == "/":
242                sitedirs = [
243                    os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages"),
244                    os.path.join(prefix, "lib", "site-python"),
245                    os.path.join(prefix, "python" + sys.version[:3], "lib-dynload"),
246                ]
247                lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages")
248                if os.path.exists(lib64_dir) and os.path.realpath(lib64_dir) not in [
249                    os.path.realpath(p) for p in sitedirs
250                ]:
251                    if _is_64bit:
252                        sitedirs.insert(0, lib64_dir)
253                    else:
254                        sitedirs.append(lib64_dir)
255                try:
256                    # sys.getobjects only available in --with-pydebug build
257                    sys.getobjects
258                    sitedirs.insert(0, os.path.join(sitedirs[0], "debug"))
259                except AttributeError:
260                    pass
261                # Debian-specific dist-packages directories:
262                sitedirs.append(os.path.join(prefix, "local/lib", "python" + sys.version[:3], "dist-packages"))
263                if sys.version[0] == "2":
264                    sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[:3], "dist-packages"))
265                else:
266                    sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[0], "dist-packages"))
267                sitedirs.append(os.path.join(prefix, "lib", "dist-python"))
268            else:
269                sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
270            if sys.platform == "darwin":
271                # for framework builds *only* we add the standard Apple
272                # locations. Currently only per-user, but /Library and
273                # /Network/Library could be added too
274                if "Python.framework" in prefix:
275                    home = os.environ.get("HOME")
276                    if home:
277                        sitedirs.append(os.path.join(home, "Library", "Python", sys.version[:3], "site-packages"))
278            for sitedir in sitedirs:
279                if os.path.isdir(sitedir):
280                    addsitedir(sitedir, known_paths)
281    return None
282
283
284def check_enableusersite():
285    """Check if user site directory is safe for inclusion
286
287    The function tests for the command line flag (including environment var),
288    process uid/gid equal to effective uid/gid.
289
290    None: Disabled for security reasons
291    False: Disabled by user (command line option)
292    True: Safe and enabled
293    """
294    if hasattr(sys, "flags") and getattr(sys.flags, "no_user_site", False):
295        return False
296
297    if hasattr(os, "getuid") and hasattr(os, "geteuid"):
298        # check process uid == effective uid
299        if os.geteuid() != os.getuid():
300            return None
301    if hasattr(os, "getgid") and hasattr(os, "getegid"):
302        # check process gid == effective gid
303        if os.getegid() != os.getgid():
304            return None
305
306    return True
307
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, "Python" + sys.version[0] + sys.version[2], "site-packages")
338    else:
339        if env_base:
340            USER_BASE = env_base
341        else:
342            USER_BASE = joinuser("~", ".local")
343        USER_SITE = os.path.join(USER_BASE, "lib", "python" + sys.version[:3], "site-packages")
344
345    if ENABLE_USER_SITE and os.path.isdir(USER_SITE):
346        addsitedir(USER_SITE, known_paths)
347    if ENABLE_USER_SITE:
348        for dist_libdir in ("lib", "local/lib"):
349            user_site = os.path.join(USER_BASE, dist_libdir, "python" + sys.version[:3], "dist-packages")
350            if os.path.isdir(user_site):
351                addsitedir(user_site, known_paths)
352    return known_paths
353
354
355def setBEGINLIBPATH():
356    """The OS/2 EMX port has optional extension modules that do double duty
357    as DLLs (and must use the .DLL file extension) for other extensions.
358    The library search path needs to be amended so these will be found
359    during module import.  Use BEGINLIBPATH so that these are at the start
360    of the library search path.
361
362    """
363    dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
364    libpath = os.environ["BEGINLIBPATH"].split(";")
365    if libpath[-1]:
366        libpath.append(dllpath)
367    else:
368        libpath[-1] = dllpath
369    os.environ["BEGINLIBPATH"] = ";".join(libpath)
370
371
372def setquit():
373    """Define new built-ins 'quit' and 'exit'.
374    These are simply strings that display a hint on how to exit.
375
376    """
377    if os.sep == ":":
378        eof = "Cmd-Q"
379    elif os.sep == "\\":
380        eof = "Ctrl-Z plus Return"
381    else:
382        eof = "Ctrl-D (i.e. EOF)"
383
384    class Quitter(object):
385        def __init__(self, name):
386            self.name = name
387
388        def __repr__(self):
389            return "Use {}() or {} to exit".format(self.name, eof)
390
391        def __call__(self, code=None):
392            # Shells like IDLE catch the SystemExit, but listen when their
393            # stdin wrapper is closed.
394            try:
395                sys.stdin.close()
396            except:
397                pass
398            raise SystemExit(code)
399
400    builtins.quit = Quitter("quit")
401    builtins.exit = Quitter("exit")
402
403
404class _Printer(object):
405    """interactive prompt objects for printing the license text, a list of
406    contributors and the copyright notice."""
407
408    MAXLINES = 23
409
410    def __init__(self, name, data, files=(), dirs=()):
411        self.__name = name
412        self.__data = data
413        self.__files = files
414        self.__dirs = dirs
415        self.__lines = None
416
417    def __setup(self):
418        if self.__lines:
419            return
420        data = None
421        for dir in self.__dirs:
422            for filename in self.__files:
423                filename = os.path.join(dir, filename)
424                try:
425                    fp = open(filename, "r")
426                    data = fp.read()
427                    fp.close()
428                    break
429                except IOError:
430                    pass
431            if data:
432                break
433        if not data:
434            data = self.__data
435        self.__lines = data.split("\n")
436        self.__linecnt = len(self.__lines)
437
438    def __repr__(self):
439        self.__setup()
440        if len(self.__lines) <= self.MAXLINES:
441            return "\n".join(self.__lines)
442        else:
443            return "Type %s() to see the full %s text" % ((self.__name,) * 2)
444
445    def __call__(self):
446        self.__setup()
447        prompt = "Hit Return for more, or q (and Return) to quit: "
448        lineno = 0
449        while 1:
450            try:
451                for i in range(lineno, lineno + self.MAXLINES):
452                    print(self.__lines[i])
453            except IndexError:
454                break
455            else:
456                lineno += self.MAXLINES
457                key = None
458                while key is None:
459                    try:
460                        key = raw_input(prompt)
461                    except NameError:
462                        key = input(prompt)
463                    if key not in ("", "q"):
464                        key = None
465                if key == "q":
466                    break
467
468
469def setcopyright():
470    """Set 'copyright' and 'credits' in __builtin__"""
471    builtins.copyright = _Printer("copyright", sys.copyright)
472    if _is_jython:
473        builtins.credits = _Printer("credits", "Jython is maintained by the Jython developers (www.jython.org).")
474    elif _is_pypy:
475        builtins.credits = _Printer("credits", "PyPy is maintained by the PyPy developers: http://pypy.org/")
476    else:
477        builtins.credits = _Printer(
478            "credits",
479            """\
480    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
481    for supporting Python development.  See www.python.org for more information.""",
482        )
483    here = os.path.dirname(os.__file__)
484    builtins.license = _Printer(
485        "license",
486        "See http://www.python.org/%.3s/license.html" % sys.version,
487        ["LICENSE.txt", "LICENSE"],
488        [os.path.join(here, os.pardir), here, os.curdir],
489    )
490
491
492class _Helper(object):
493    """Define the built-in 'help'.
494    This is a wrapper around pydoc.help (with a twist).
495
496    """
497
498    def __repr__(self):
499        return "Type help() for interactive help, " "or help(object) for help about object."
500
501    def __call__(self, *args, **kwds):
502        import pydoc
503
504        return pydoc.help(*args, **kwds)
505
506
507def sethelper():
508    builtins.help = _Helper()
509
510
511def aliasmbcs():
512    """On Windows, some default encodings are not provided by Python,
513    while they are always available as "mbcs" in each locale. Make
514    them usable by aliasing to "mbcs" in such a case."""
515    if sys.platform == "win32":
516        import locale, codecs
517
518        enc = locale.getdefaultlocale()[1]
519        if enc.startswith("cp"):  # "cp***" ?
520            try:
521                codecs.lookup(enc)
522            except LookupError:
523                import encodings
524
525                encodings._cache[enc] = encodings._unknown
526                encodings.aliases.aliases[enc] = "mbcs"
527
528
529def setencoding():
530    """Set the string encoding used by the Unicode implementation.  The
531    default is 'ascii', but if you're willing to experiment, you can
532    change this."""
533    encoding = "ascii"  # Default value set by _PyUnicode_Init()
534    if 0:
535        # Enable to support locale aware default string encodings.
536        import locale
537
538        loc = locale.getdefaultlocale()
539        if loc[1]:
540            encoding = loc[1]
541    if 0:
542        # Enable to switch off string to Unicode coercion and implicit
543        # Unicode to string conversion.
544        encoding = "undefined"
545    if encoding != "ascii":
546        # On Non-Unicode builds this will raise an AttributeError...
547        sys.setdefaultencoding(encoding)  # Needs Python Unicode build !
548
549
550def execsitecustomize():
551    """Run custom site specific code, if available."""
552    try:
553        import sitecustomize
554    except ImportError:
555        pass
556
557
558def virtual_install_main_packages():
559    f = open(os.path.join(os.path.dirname(__file__), "orig-prefix.txt"))
560    sys.real_prefix = f.read().strip()
561    f.close()
562    pos = 2
563    hardcoded_relative_dirs = []
564    if sys.path[0] == "":
565        pos += 1
566    if _is_jython:
567        paths = [os.path.join(sys.real_prefix, "Lib")]
568    elif _is_pypy:
569        if sys.version_info > (3, 2):
570            cpyver = "%d" % sys.version_info[0]
571        elif sys.pypy_version_info >= (1, 5):
572            cpyver = "%d.%d" % sys.version_info[:2]
573        else:
574            cpyver = "%d.%d.%d" % sys.version_info[:3]
575        paths = [os.path.join(sys.real_prefix, "lib_pypy"), os.path.join(sys.real_prefix, "lib-python", cpyver)]
576        if sys.pypy_version_info < (1, 9):
577            paths.insert(1, os.path.join(sys.real_prefix, "lib-python", "modified-%s" % cpyver))
578        hardcoded_relative_dirs = paths[:]  # for the special 'darwin' case below
579        #
580        # This is hardcoded in the Python executable, but relative to sys.prefix:
581        for path in paths[:]:
582            plat_path = os.path.join(path, "plat-%s" % sys.platform)
583            if os.path.exists(plat_path):
584                paths.append(plat_path)
585    elif sys.platform == "win32":
586        paths = [os.path.join(sys.real_prefix, "Lib"), os.path.join(sys.real_prefix, "DLLs")]
587    else:
588        paths = [os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3])]
589        hardcoded_relative_dirs = paths[:]  # for the special 'darwin' case below
590        lib64_path = os.path.join(sys.real_prefix, "lib64", "python" + sys.version[:3])
591        if os.path.exists(lib64_path):
592            if _is_64bit:
593                paths.insert(0, lib64_path)
594            else:
595                paths.append(lib64_path)
596        # This is hardcoded in the Python executable, but relative to
597        # sys.prefix.  Debian change: we need to add the multiarch triplet
598        # here, which is where the real stuff lives.  As per PEP 421, in
599        # Python 3.3+, this lives in sys.implementation, while in Python 2.7
600        # it lives in sys.
601        try:
602            arch = getattr(sys, "implementation", sys)._multiarch
603        except AttributeError:
604            # This is a non-multiarch aware Python.  Fallback to the old way.
605            arch = sys.platform
606        plat_path = os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3], "plat-%s" % arch)
607        if os.path.exists(plat_path):
608            paths.append(plat_path)
609    # This is hardcoded in the Python executable, but
610    # relative to sys.prefix, so we have to fix up:
611    for path in list(paths):
612        tk_dir = os.path.join(path, "lib-tk")
613        if os.path.exists(tk_dir):
614            paths.append(tk_dir)
615
616    # These are hardcoded in the Apple's Python executable,
617    # but relative to sys.prefix, so we have to fix them up:
618    if sys.platform == "darwin":
619        hardcoded_paths = [
620            os.path.join(relative_dir, module)
621            for relative_dir in hardcoded_relative_dirs
622            for module in ("plat-darwin", "plat-mac", "plat-mac/lib-scriptpackages")
623        ]
624
625        for path in hardcoded_paths:
626            if os.path.exists(path):
627                paths.append(path)
628
629    sys.path.extend(paths)
630
631
632def force_global_eggs_after_local_site_packages():
633    """
634    Force easy_installed eggs in the global environment to get placed
635    in sys.path after all packages inside the virtualenv.  This
636    maintains the "least surprise" result that packages in the
637    virtualenv always mask global packages, never the other way
638    around.
639
640    """
641    egginsert = getattr(sys, "__egginsert", 0)
642    for i, path in enumerate(sys.path):
643        if i > egginsert and path.startswith(sys.prefix):
644            egginsert = i
645    sys.__egginsert = egginsert + 1
646
647
648def virtual_addsitepackages(known_paths):
649    force_global_eggs_after_local_site_packages()
650    return addsitepackages(known_paths, sys_prefix=sys.real_prefix)
651
652
653def fixclasspath():
654    """Adjust the special classpath sys.path entries for Jython. These
655    entries should follow the base virtualenv lib directories.
656    """
657    paths = []
658    classpaths = []
659    for path in sys.path:
660        if path == "__classpath__" or path.startswith("__pyclasspath__"):
661            classpaths.append(path)
662        else:
663            paths.append(path)
664    sys.path = paths
665    sys.path.extend(classpaths)
666
667
668def execusercustomize():
669    """Run custom user specific code, if available."""
670    try:
671        import usercustomize
672    except ImportError:
673        pass
674
675
676def enablerlcompleter():
677    """Enable default readline configuration on interactive prompts, by
678    registering a sys.__interactivehook__.
679    If the readline module can be imported, the hook will set the Tab key
680    as completion key and register ~/.python_history as history file.
681    This can be overridden in the sitecustomize or usercustomize module,
682    or in a PYTHONSTARTUP file.
683    """
684
685    def register_readline():
686        import atexit
687
688        try:
689            import readline
690            import rlcompleter
691        except ImportError:
692            return
693
694        # Reading the initialization (config) file may not be enough to set a
695        # completion key, so we set one first and then read the file.
696        readline_doc = getattr(readline, "__doc__", "")
697        if readline_doc is not None and "libedit" in readline_doc:
698            readline.parse_and_bind("bind ^I rl_complete")
699        else:
700            readline.parse_and_bind("tab: complete")
701
702        try:
703            readline.read_init_file()
704        except OSError:
705            # An OSError here could have many causes, but the most likely one
706            # is that there's no .inputrc file (or .editrc file in the case of
707            # Mac OS X + libedit) in the expected location.  In that case, we
708            # want to ignore the exception.
709            pass
710
711        if readline.get_current_history_length() == 0:
712            # If no history was loaded, default to .python_history.
713            # The guard is necessary to avoid doubling history size at
714            # each interpreter exit when readline was already configured
715            # through a PYTHONSTARTUP hook, see:
716            # http://bugs.python.org/issue5845#msg198636
717            history = os.path.join(os.path.expanduser("~"), ".python_history")
718            try:
719                readline.read_history_file(history)
720            except OSError:
721                pass
722
723            def write_history():
724                try:
725                    readline.write_history_file(history)
726                except (FileNotFoundError, PermissionError):
727                    # home directory does not exist or is not writable
728                    # https://bugs.python.org/issue19891
729                    pass
730
731            atexit.register(write_history)
732
733    sys.__interactivehook__ = register_readline
734
735
736def main():
737    global ENABLE_USER_SITE
738    virtual_install_main_packages()
739    abs__file__()
740    paths_in_sys = removeduppaths()
741    if os.name == "posix" and sys.path and os.path.basename(sys.path[-1]) == "Modules":
742        addbuilddir()
743    if _is_jython:
744        fixclasspath()
745    GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), "no-global-site-packages.txt"))
746    if not GLOBAL_SITE_PACKAGES:
747        ENABLE_USER_SITE = False
748    if ENABLE_USER_SITE is None:
749        ENABLE_USER_SITE = check_enableusersite()
750    paths_in_sys = addsitepackages(paths_in_sys)
751    paths_in_sys = addusersitepackages(paths_in_sys)
752    if GLOBAL_SITE_PACKAGES:
753        paths_in_sys = virtual_addsitepackages(paths_in_sys)
754    if sys.platform == "os2emx":
755        setBEGINLIBPATH()
756    setquit()
757    setcopyright()
758    sethelper()
759    if sys.version_info[0] == 3:
760        enablerlcompleter()
761    aliasmbcs()
762    setencoding()
763    execsitecustomize()
764    if ENABLE_USER_SITE:
765        execusercustomize()
766    # Remove sys.setdefaultencoding() so that users cannot change the
767    # encoding after initialization.  The test for presence is needed when
768    # this module is run as a script, because this code is executed twice.
769    if hasattr(sys, "setdefaultencoding"):
770        del sys.setdefaultencoding
771
772
773main()
774
775
776def _script():
777    help = """\
778    %s [--user-base] [--user-site]
779
780    Without arguments print some useful information
781    With arguments print the value of USER_BASE and/or USER_SITE separated
782    by '%s'.
783
784    Exit codes with --user-base or --user-site:
785      0 - user site directory is enabled
786      1 - user site directory is disabled by user
787      2 - uses site directory is disabled by super user
788          or for security reasons
789     >2 - unknown error
790    """
791    args = sys.argv[1:]
792    if not args:
793        print("sys.path = [")
794        for dir in sys.path:
795            print("    {!r},".format(dir))
796        print("]")
797
798        def exists(path):
799            if os.path.isdir(path):
800                return "exists"
801            else:
802                return "doesn't exist"
803
804        print("USER_BASE: {!r} ({})".format(USER_BASE, exists(USER_BASE)))
805        print("USER_SITE: {!r} ({})".format(USER_SITE, exists(USER_BASE)))
806        print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE)
807        sys.exit(0)
808
809    buffer = []
810    if "--user-base" in args:
811        buffer.append(USER_BASE)
812    if "--user-site" in args:
813        buffer.append(USER_SITE)
814
815    if buffer:
816        print(os.pathsep.join(buffer))
817        if ENABLE_USER_SITE:
818            sys.exit(0)
819        elif ENABLE_USER_SITE is False:
820            sys.exit(1)
821        elif ENABLE_USER_SITE is None:
822            sys.exit(2)
823        else:
824            sys.exit(3)
825    else:
826        import textwrap
827
828        print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
829        sys.exit(10)
830
831
832if __name__ == "__main__":
833    _script()
834