Fix the availability statement for the spawn*() functions to reflect the
[python/dscho.git] / Lib / site.py
blob09043a8b4a551c3abd9d3411dde58db3918658c4
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 for dir in sys.path:
77 # Filter out paths that don't exist, but leave in the empty string
78 # since it's a special case. We also need to special-case the Mac,
79 # as file names are allowed on sys.path there.
80 if sys.platform != 'mac':
81 if dir and not os.path.isdir(dir):
82 continue
83 else:
84 if dir and not os.path.exists(dir):
85 continue
86 dir, dircase = makepath(dir)
87 if not _dirs_in_sys_path.has_key(dircase):
88 L.append(dir)
89 _dirs_in_sys_path[dircase] = 1
90 sys.path[:] = L
91 del dir, L
93 # Append ./build/lib.<platform> in case we're running in the build dir
94 # (especially for Guido :-)
95 if os.name == "posix" and os.path.basename(sys.path[-1]) == "Modules":
96 from distutils.util import get_platform
97 s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
98 s = os.path.join(os.path.dirname(sys.path[-1]), s)
99 sys.path.append(s)
100 del get_platform, s
102 def _init_pathinfo():
103 global _dirs_in_sys_path
104 _dirs_in_sys_path = d = {}
105 for dir in sys.path:
106 if dir and not os.path.isdir(dir):
107 continue
108 dir, dircase = makepath(dir)
109 d[dircase] = 1
111 def addsitedir(sitedir):
112 global _dirs_in_sys_path
113 if _dirs_in_sys_path is None:
114 _init_pathinfo()
115 reset = 1
116 else:
117 reset = 0
118 sitedir, sitedircase = makepath(sitedir)
119 if not _dirs_in_sys_path.has_key(sitedircase):
120 sys.path.append(sitedir) # Add path component
121 try:
122 names = os.listdir(sitedir)
123 except os.error:
124 return
125 names.sort()
126 for name in names:
127 if name[-4:] == os.extsep + "pth":
128 addpackage(sitedir, name)
129 if reset:
130 _dirs_in_sys_path = None
132 def addpackage(sitedir, name):
133 global _dirs_in_sys_path
134 if _dirs_in_sys_path is None:
135 _init_pathinfo()
136 reset = 1
137 else:
138 reset = 0
139 fullname = os.path.join(sitedir, name)
140 try:
141 f = open(fullname)
142 except IOError:
143 return
144 while 1:
145 dir = f.readline()
146 if not dir:
147 break
148 if dir[0] == '#':
149 continue
150 if dir.startswith("import"):
151 exec dir
152 continue
153 if dir[-1] == '\n':
154 dir = dir[:-1]
155 dir, dircase = makepath(sitedir, dir)
156 if not _dirs_in_sys_path.has_key(dircase) and os.path.exists(dir):
157 sys.path.append(dir)
158 _dirs_in_sys_path[dircase] = 1
159 if reset:
160 _dirs_in_sys_path = None
162 prefixes = [sys.prefix]
163 if sys.exec_prefix != sys.prefix:
164 prefixes.append(sys.exec_prefix)
165 for prefix in prefixes:
166 if prefix:
167 if 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 for sitedir in sitedirs:
176 if os.path.isdir(sitedir):
177 addsitedir(sitedir)
179 _dirs_in_sys_path = None
182 # Define new built-ins 'quit' and 'exit'.
183 # These are simply strings that display a hint on how to exit.
184 if os.sep == ':':
185 exit = 'Use Cmd-Q to quit.'
186 elif os.sep == '\\':
187 exit = 'Use Ctrl-Z plus Return to exit.'
188 else:
189 exit = 'Use Ctrl-D (i.e. EOF) to exit.'
190 import __builtin__
191 __builtin__.quit = __builtin__.exit = exit
192 del exit
194 # interactive prompt objects for printing the license text, a list of
195 # contributors and the copyright notice.
196 class _Printer:
197 MAXLINES = 23
199 def __init__(self, name, data, files=(), dirs=()):
200 self.__name = name
201 self.__data = data
202 self.__files = files
203 self.__dirs = dirs
204 self.__lines = None
206 def __setup(self):
207 if self.__lines:
208 return
209 data = None
210 for dir in self.__dirs:
211 for file in self.__files:
212 file = os.path.join(dir, file)
213 try:
214 fp = open(file)
215 data = fp.read()
216 fp.close()
217 break
218 except IOError:
219 pass
220 if data:
221 break
222 if not data:
223 data = self.__data
224 self.__lines = data.split('\n')
225 self.__linecnt = len(self.__lines)
227 def __repr__(self):
228 self.__setup()
229 if len(self.__lines) <= self.MAXLINES:
230 return "\n".join(self.__lines)
231 else:
232 return "Type %s() to see the full %s text" % ((self.__name,)*2)
234 def __call__(self):
235 self.__setup()
236 prompt = 'Hit Return for more, or q (and Return) to quit: '
237 lineno = 0
238 while 1:
239 try:
240 for i in range(lineno, lineno + self.MAXLINES):
241 print self.__lines[i]
242 except IndexError:
243 break
244 else:
245 lineno += self.MAXLINES
246 key = None
247 while key is None:
248 key = raw_input(prompt)
249 if key not in ('', 'q'):
250 key = None
251 if key == 'q':
252 break
254 __builtin__.copyright = _Printer("copyright", sys.copyright)
255 if sys.platform[:4] == 'java':
256 __builtin__.credits = _Printer(
257 "credits",
258 "Jython is maintained by the Jython developers (www.jython.org).")
259 else:
260 __builtin__.credits = _Printer("credits", """\
261 Thanks to CWI, CNRI, BeOpen.com, Digital Creations and a cast of thousands
262 for supporting Python development. See www.python.org for more information.""")
263 here = os.path.dirname(os.__file__)
264 __builtin__.license = _Printer(
265 "license", "See http://www.python.org/%.3s/license.html" % sys.version,
266 ["LICENSE.txt", "LICENSE"],
267 [os.path.join(here, os.pardir), here, os.curdir])
270 # Define new built-in 'help'.
271 # This is a wrapper around pydoc.help (with a twist).
273 class _Helper:
274 def __repr__(self):
275 return "Type help() for interactive help, " \
276 "or help(object) for help about object."
277 def __call__(self, *args, **kwds):
278 import pydoc
279 return pydoc.help(*args, **kwds)
281 __builtin__.help = _Helper()
284 # Set the string encoding used by the Unicode implementation. The
285 # default is 'ascii', but if you're willing to experiment, you can
286 # change this.
288 encoding = "ascii" # Default value set by _PyUnicode_Init()
290 if 0:
291 # Enable to support locale aware default string encodings.
292 import locale
293 loc = locale.getdefaultlocale()
294 if loc[1]:
295 encoding = loc[1]
297 if 0:
298 # Enable to switch off string to Unicode coercion and implicit
299 # Unicode to string conversion.
300 encoding = "undefined"
302 if encoding != "ascii":
303 # On Non-Unicode builds this will raise an AttributeError...
304 sys.setdefaultencoding(encoding) # Needs Python Unicode build !
307 # Run custom site specific code, if available.
309 try:
310 import sitecustomize
311 except ImportError:
312 pass
315 # Remove sys.setdefaultencoding() so that users cannot change the
316 # encoding after initialization. The test for presence is needed when
317 # this module is run as a script, because this code is executed twice.
319 if hasattr(sys, "setdefaultencoding"):
320 del sys.setdefaultencoding
322 def _test():
323 print "sys.path = ["
324 for dir in sys.path:
325 print " %s," % `dir`
326 print "]"
328 if __name__ == '__main__':
329 _test()