site.py 6.38 KB
Newer Older
1
"""Append module search paths for third-party packages to sys.path.
2

3 4 5
****************************************************************
* This module is automatically imported during initialization. *
****************************************************************
6

7 8 9 10 11
In earlier versions of Python (up to 1.5a3), scripts or modules that
needed to use site-specific modules would place ``import site''
somewhere near the top of their code.  Because of the automatic
import, this is no longer necessary (but code that does it still
works).
12

13 14 15 16 17
This will append site-specific paths to to the module search path.  On
Unix, it starts with sys.prefix and sys.exec_prefix (if different) and
appends lib/python<version>/site-packages as well as lib/site-python.
On other platforms (mainly Mac and Windows), it uses just sys.prefix
(and sys.exec_prefix, if different, but this is unlikely).  The
18 19
resulting directories, if they exist, are appended to sys.path, and
also inspected for path configuration files.
20

21 22 23 24 25 26
A path configuration file is a file whose name has the form
<package>.pth; its contents are additional directories (one per line)
to be added to sys.path.  Non-existing directories (or
non-directories) are never added to sys.path; no directory is added to
sys.path more than once.  Blank lines and lines beginning with
\code{#} are skipped.
27

28
For example, suppose sys.prefix and sys.exec_prefix are set to
29
/usr/local and there is a directory /usr/local/lib/python1.5/site-packages
30 31 32
with three subdirectories, foo, bar and spam, and two path
configuration files, foo.pth and bar.pth.  Assume foo.pth contains the
following:
33 34 35 36 37 38 39 40 41 42 43 44 45

  # foo package configuration
  foo
  bar
  bletch

and bar.pth contains:

  # bar package configuration
  bar

Then the following directories are added to sys.path, in this order:

46 47
  /usr/local/lib/python1.5/site-packages/bar
  /usr/local/lib/python1.5/site-packages/foo
48 49 50 51

Note that bletch is omitted because it doesn't exist; bar precedes foo
because bar.pth comes alphabetically before foo.pth; and spam is
omitted because it is not mentioned in either path configuration file.
52 53

After these path manipulations, an attempt is made to import a module
54 55 56
named sitecustomize, which can perform arbitrary additional
site-specific customizations.  If this import fails with an
ImportError exception, it is silently ignored.
57 58 59 60 61

"""

import sys, os

62 63
def addsitedir(sitedir):
    if sitedir not in sys.path:
64
        sys.path.append(sitedir)        # Add path component
65
    try:
66
        names = os.listdir(sitedir)
67
    except os.error:
68
        return
69 70 71
    names = map(os.path.normcase, names)
    names.sort()
    for name in names:
72 73
        if name[-4:] == ".pth":
            addpackage(sitedir, name)
74 75 76 77

def addpackage(sitedir, name):
    fullname = os.path.join(sitedir, name)
    try:
78
        f = open(fullname)
79
    except IOError:
80
        return
81
    while 1:
82 83 84 85 86 87 88 89 90 91
        dir = f.readline()
        if not dir:
            break
        if dir[0] == '#':
            continue
        if dir[-1] == '\n':
            dir = dir[:-1]
        dir = os.path.join(sitedir, dir)
        if dir not in sys.path and os.path.exists(dir):
            sys.path.append(dir)
92 93 94 95 96

prefixes = [sys.prefix]
if sys.exec_prefix != sys.prefix:
    prefixes.append(sys.exec_prefix)
for prefix in prefixes:
97
    if prefix:
98 99 100 101 102 103 104 105 106 107 108
        if os.sep == '/':
            sitedirs = [os.path.join(prefix,
                                     "lib",
                                     "python" + sys.version[:3],
                                     "site-packages"),
                        os.path.join(prefix, "lib", "site-python")]
        else:
            sitedirs = [prefix]
        for sitedir in sitedirs:
            if os.path.isdir(sitedir):
                addsitedir(sitedir)
109

110 111 112 113 114 115 116 117 118 119 120 121
# Define new built-ins 'quit' and 'exit'.
# These are simply strings that display a hint on how to exit.
if os.sep == ':':
    exit = 'Use Cmd-Q to quit.'
elif os.sep == '\\':
    exit = 'Use Ctrl-Z plus Return to exit.'
else:
    exit = 'Use Ctrl-D (i.e. EOF) to exit.'
import __builtin__
__builtin__.quit = __builtin__.exit = exit
del exit

122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
# interactive prompt objects for printing the license text, a list of
# contributors and the copyright notice.
class _Printer:
    MAXLINES = 23

    def __init__(self, s):
        self.__lines = s.split('\n')
        self.__linecnt = len(self.__lines)

    def __repr__(self):
        prompt = 'Hit Return for more, or q (and Return) to quit: '
        lineno = 0
        while 1:
            try:
                for i in range(lineno, lineno + self.MAXLINES):
                    print self.__lines[i]
            except IndexError:
                break
            else:
                lineno += self.MAXLINES
                key = None
                while key is None:
                    key = raw_input(prompt)
                    if key not in ('', 'q'):
                        key = None
                if key == 'q':
                    break
        return ''

__builtin__.copyright = _Printer(sys.copyright)
__builtin__.credits = _Printer(
    '''Python development is led by BeOpen PythonLabs (www.pythonlabs.com).''')

def make_license(filename):
    try:
        return _Printer(open(filename).read())
    except IOError:
        return None

here = os.path.dirname(os.__file__)
for dir in here, os.path.join(here, os.pardir), os.curdir:
    for file in "LICENSE.txt", "LICENSE":
        lic = make_license(os.path.join(dir, file))
        if lic:
            break
    if lic:
        __builtin__.license = lic
        break
else:
    __builtin__.license = _Printer('See http://hdl.handle.net/1895.22/1012')


174 175 176
# Set the string encoding used by the Unicode implementation.  The
# default is 'ascii', but if you're willing to experiment, you can
# change this.
177

178
encoding = "ascii" # default
179 180

if 0:
181
    # Enable to support locale aware default string encodings.
182 183 184 185 186 187
    import locale
    loc = locale.getdefaultlocale()
    if loc[1]:
        encoding = loc[1]

if 0:
188 189
    # Enable to switch off string to Unicode coercion and implicit
    # Unicode to string conversion.
190 191
    encoding = "undefined"

192
sys.setdefaultencoding(encoding)
193 194 195 196

#
# Run custom site specific code, if available.
#
197
try:
198
    import sitecustomize
199
except ImportError:
200 201 202 203 204 205 206
    pass

#
# Remove sys.setdefaultencoding() so that users cannot change the
# encoding after initialization.
#
del sys.setdefaultencoding
207 208 209 210

def _test():
    print "sys.path = ["
    for dir in sys.path:
211
        print "    %s," % `dir`
212 213 214 215
    print "]"

if __name__ == '__main__':
    _test()