Update version number and release date.
[python/dscho.git] / Lib / site.py
blobe862fc2133a5fb3c5a5918a1720bd664f4906693
1 """Append module search paths for third-party packages to sys.path.
3 ****************************************************************
4 * This module is automatically imported during initialization. *
5 ****************************************************************
7 In earlier versions of Python (up to 1.5a3), scripts or modules that
8 needed to use site-specific modules would place ``import site''
9 somewhere near the top of their code. Because of the automatic
10 import, this is no longer necessary (but code that does it still
11 works).
13 This will append site-specific paths to to the module search path. On
14 Unix, it starts with sys.prefix and sys.exec_prefix (if different) and
15 appends lib/python<version>/site-packages as well as lib/site-python.
16 On other platforms (mainly Mac and Windows), it uses just sys.prefix
17 (and sys.exec_prefix, if different, but this is unlikely). The
18 resulting directories, if they exist, are appended to sys.path, and
19 also inspected for path configuration files.
21 A path configuration file is a file whose name has the form
22 <package>.pth; its contents are additional directories (one per line)
23 to be added to sys.path. Non-existing directories (or
24 non-directories) are never added to sys.path; no directory is added to
25 sys.path more than once. Blank lines and lines beginning with
26 '#' are skipped. Lines starting with 'import' are executed.
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 with three subdirectories, foo, bar and spam, and two path
31 configuration files, foo.pth and bar.pth. Assume foo.pth contains the
32 following:
34 # foo package configuration
35 foo
36 bar
37 bletch
39 and bar.pth contains:
41 # bar package configuration
42 bar
44 Then the following directories are added to sys.path, in this order:
46 /usr/local/lib/python1.5/site-packages/bar
47 /usr/local/lib/python1.5/site-packages/foo
49 Note that bletch is omitted because it doesn't exist; bar precedes foo
50 because bar.pth comes alphabetically before foo.pth; and spam is
51 omitted because it is not mentioned in either path configuration file.
53 After these path manipulations, an attempt is made to import a module
54 named sitecustomize, which can perform arbitrary additional
55 site-specific customizations. If this import fails with an
56 ImportError exception, it is silently ignored.
58 """
60 import sys, os
63 def makepath(*paths):
64 dir = os.path.abspath(os.path.join(*paths))
65 return dir, os.path.normcase(dir)
67 for m in sys.modules.values():
68 if hasattr(m, "__file__") and m.__file__:
69 m.__file__ = os.path.abspath(m.__file__)
70 del m
72 # This ensures that the initial path provided by the interpreter contains
73 # only absolute pathnames, even if we're running from the build directory.
74 L = []
75 _dirs_in_sys_path = {}
76 dir = dircase = None # sys.path may be empty at this point
77 for dir in sys.path:
78 # Filter out duplicate paths (on case-insensitive file systems also
79 # if they only differ in case); turn relative paths into absolute
80 # paths.
81 dir, dircase = makepath(dir)
82 if not dircase in _dirs_in_sys_path:
83 L.append(dir)
84 _dirs_in_sys_path[dircase] = 1
85 sys.path[:] = L
86 del dir, dircase, L
88 # Append ./build/lib.<platform> in case we're running in the build dir
89 # (especially for Guido :-)
90 # XXX This should not be part of site.py, since it is needed even when
91 # using the -S option for Python. See http://www.python.org/sf/586680
92 if (os.name == "posix" and sys.path and
93 os.path.basename(sys.path[-1]) == "Modules"):
94 from distutils.util import get_platform
95 s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
96 s = os.path.join(os.path.dirname(sys.path[-1]), s)
97 sys.path.append(s)
98 del get_platform, s
100 def _init_pathinfo():
101 global _dirs_in_sys_path
102 _dirs_in_sys_path = d = {}
103 for dir in sys.path:
104 if dir and not os.path.isdir(dir):
105 continue
106 dir, dircase = makepath(dir)
107 d[dircase] = 1
109 def addsitedir(sitedir):
110 global _dirs_in_sys_path
111 if _dirs_in_sys_path is None:
112 _init_pathinfo()
113 reset = 1
114 else:
115 reset = 0
116 sitedir, sitedircase = makepath(sitedir)
117 if not sitedircase in _dirs_in_sys_path:
118 sys.path.append(sitedir) # Add path component
119 try:
120 names = os.listdir(sitedir)
121 except os.error:
122 return
123 names.sort()
124 for name in names:
125 if name[-4:] == os.extsep + "pth":
126 addpackage(sitedir, name)
127 if reset:
128 _dirs_in_sys_path = None
130 def addpackage(sitedir, name):
131 global _dirs_in_sys_path
132 if _dirs_in_sys_path is None:
133 _init_pathinfo()
134 reset = 1
135 else:
136 reset = 0
137 fullname = os.path.join(sitedir, name)
138 try:
139 f = open(fullname)
140 except IOError:
141 return
142 while 1:
143 dir = f.readline()
144 if not dir:
145 break
146 if dir[0] == '#':
147 continue
148 if dir.startswith("import"):
149 exec dir
150 continue
151 if dir[-1] == '\n':
152 dir = dir[:-1]
153 dir, dircase = makepath(sitedir, dir)
154 if not dircase in _dirs_in_sys_path and os.path.exists(dir):
155 sys.path.append(dir)
156 _dirs_in_sys_path[dircase] = 1
157 if reset:
158 _dirs_in_sys_path = None
160 prefixes = [sys.prefix]
161 if sys.exec_prefix != sys.prefix:
162 prefixes.append(sys.exec_prefix)
163 for prefix in prefixes:
164 if prefix:
165 if sys.platform == 'os2emx':
166 sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
167 elif os.sep == '/':
168 sitedirs = [os.path.join(prefix,
169 "lib",
170 "python" + sys.version[:3],
171 "site-packages"),
172 os.path.join(prefix, "lib", "site-python")]
173 else:
174 sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
175 if sys.platform == 'darwin':
176 # for framework builds *only* we add the standard Apple
177 # locations. Currently only per-user, but /Library and
178 # /Network/Library could be added too
179 if 'Python.framework' in prefix:
180 home = os.environ['HOME']
181 if home:
182 sitedirs.append(
183 os.path.join(home,
184 'Library',
185 'Python',
186 sys.version[:3],
187 'site-packages'))
188 for sitedir in sitedirs:
189 if os.path.isdir(sitedir):
190 addsitedir(sitedir)
191 del prefix, sitedir
193 _dirs_in_sys_path = None
196 # Define new built-ins 'quit' and 'exit'.
197 # These are simply strings that display a hint on how to exit.
198 if os.sep == ':':
199 exit = 'Use Cmd-Q to quit.'
200 elif os.sep == '\\':
201 exit = 'Use Ctrl-Z plus Return to exit.'
202 else:
203 exit = 'Use Ctrl-D (i.e. EOF) to exit.'
204 import __builtin__
205 __builtin__.quit = __builtin__.exit = exit
206 del exit
208 # interactive prompt objects for printing the license text, a list of
209 # contributors and the copyright notice.
210 class _Printer:
211 MAXLINES = 23
213 def __init__(self, name, data, files=(), dirs=()):
214 self.__name = name
215 self.__data = data
216 self.__files = files
217 self.__dirs = dirs
218 self.__lines = None
220 def __setup(self):
221 if self.__lines:
222 return
223 data = None
224 for dir in self.__dirs:
225 for file in self.__files:
226 file = os.path.join(dir, file)
227 try:
228 fp = open(file)
229 data = fp.read()
230 fp.close()
231 break
232 except IOError:
233 pass
234 if data:
235 break
236 if not data:
237 data = self.__data
238 self.__lines = data.split('\n')
239 self.__linecnt = len(self.__lines)
241 def __repr__(self):
242 self.__setup()
243 if len(self.__lines) <= self.MAXLINES:
244 return "\n".join(self.__lines)
245 else:
246 return "Type %s() to see the full %s text" % ((self.__name,)*2)
248 def __call__(self):
249 self.__setup()
250 prompt = 'Hit Return for more, or q (and Return) to quit: '
251 lineno = 0
252 while 1:
253 try:
254 for i in range(lineno, lineno + self.MAXLINES):
255 print self.__lines[i]
256 except IndexError:
257 break
258 else:
259 lineno += self.MAXLINES
260 key = None
261 while key is None:
262 key = raw_input(prompt)
263 if key not in ('', 'q'):
264 key = None
265 if key == 'q':
266 break
268 __builtin__.copyright = _Printer("copyright", sys.copyright)
269 if sys.platform[:4] == 'java':
270 __builtin__.credits = _Printer(
271 "credits",
272 "Jython is maintained by the Jython developers (www.jython.org).")
273 else:
274 __builtin__.credits = _Printer("credits", """\
275 Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
276 for supporting Python development. See www.python.org for more information.""")
277 here = os.path.dirname(os.__file__)
278 __builtin__.license = _Printer(
279 "license", "See http://www.python.org/%.3s/license.html" % sys.version,
280 ["LICENSE.txt", "LICENSE"],
281 [os.path.join(here, os.pardir), here, os.curdir])
284 # Define new built-in 'help'.
285 # This is a wrapper around pydoc.help (with a twist).
287 class _Helper:
288 def __repr__(self):
289 return "Type help() for interactive help, " \
290 "or help(object) for help about object."
291 def __call__(self, *args, **kwds):
292 import pydoc
293 return pydoc.help(*args, **kwds)
295 __builtin__.help = _Helper()
298 # On Windows, some default encodings are not provided
299 # by Python (e.g. "cp932" in Japanese locale), while they
300 # are always available as "mbcs" in each locale.
301 # Make them usable by aliasing to "mbcs" in such a case.
303 if sys.platform == 'win32':
304 import locale, codecs
305 enc = locale.getdefaultlocale()[1]
306 if enc.startswith('cp'): # "cp***" ?
307 try:
308 codecs.lookup(enc)
309 except LookupError:
310 import encodings
311 encodings._cache[enc] = encodings._unknown
312 encodings.aliases.aliases[enc] = 'mbcs'
314 # Set the string encoding used by the Unicode implementation. The
315 # default is 'ascii', but if you're willing to experiment, you can
316 # change this.
318 encoding = "ascii" # Default value set by _PyUnicode_Init()
320 if 0:
321 # Enable to support locale aware default string encodings.
322 import locale
323 loc = locale.getdefaultlocale()
324 if loc[1]:
325 encoding = loc[1]
327 if 0:
328 # Enable to switch off string to Unicode coercion and implicit
329 # Unicode to string conversion.
330 encoding = "undefined"
332 if encoding != "ascii":
333 # On Non-Unicode builds this will raise an AttributeError...
334 sys.setdefaultencoding(encoding) # Needs Python Unicode build !
337 # Run custom site specific code, if available.
339 try:
340 import sitecustomize
341 except ImportError:
342 pass
345 # Remove sys.setdefaultencoding() so that users cannot change the
346 # encoding after initialization. The test for presence is needed when
347 # this module is run as a script, because this code is executed twice.
349 if hasattr(sys, "setdefaultencoding"):
350 del sys.setdefaultencoding
352 def _test():
353 print "sys.path = ["
354 for dir in sys.path:
355 print " %s," % `dir`
356 print "]"
358 if __name__ == '__main__':
359 _test()