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
13 This will append site-specific paths 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
34 # foo package configuration
41 # bar package configuration
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.
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
__)
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.
75 _dirs_in_sys_path
= {}
76 dir = dircase
= None # sys.path may be empty at this point
78 # Filter out duplicate paths (on case-insensitive file systems also
79 # if they only differ in case); turn relative paths into absolute
81 dir, dircase
= makepath(dir)
82 if not dircase
in _dirs_in_sys_path
:
84 _dirs_in_sys_path
[dircase
] = 1
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
)
100 def _init_pathinfo():
101 global _dirs_in_sys_path
102 _dirs_in_sys_path
= d
= {}
104 if dir and not os
.path
.isdir(dir):
106 dir, dircase
= makepath(dir)
109 def addsitedir(sitedir
):
110 global _dirs_in_sys_path
111 if _dirs_in_sys_path
is None:
116 sitedir
, sitedircase
= makepath(sitedir
)
117 if not sitedircase
in _dirs_in_sys_path
:
118 sys
.path
.append(sitedir
) # Add path component
120 names
= os
.listdir(sitedir
)
125 if name
[-4:] == os
.extsep
+ "pth":
126 addpackage(sitedir
, name
)
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:
137 fullname
= os
.path
.join(sitedir
, name
)
148 if dir.startswith("import"):
152 dir, dircase
= makepath(sitedir
, dir)
153 if not dircase
in _dirs_in_sys_path
and os
.path
.exists(dir):
155 _dirs_in_sys_path
[dircase
] = 1
157 _dirs_in_sys_path
= None
159 prefixes
= [sys
.prefix
]
160 sitedir
= None # make sure sitedir is initialized because of later 'del'
161 if sys
.exec_prefix
!= sys
.prefix
:
162 prefixes
.append(sys
.exec_prefix
)
163 for prefix
in prefixes
:
165 if sys
.platform
in ('os2emx', 'riscos'):
166 sitedirs
= [os
.path
.join(prefix
, "Lib", "site-packages")]
168 sitedirs
= [os
.path
.join(prefix
,
170 "python" + sys
.version
[:3],
172 os
.path
.join(prefix
, "lib", "site-python")]
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
.get('HOME')
188 for sitedir
in sitedirs
:
189 if os
.path
.isdir(sitedir
):
193 _dirs_in_sys_path
= None
196 # the OS/2 EMX port has optional extension modules that do double duty
197 # as DLLs (and must use the .DLL file extension) for other extensions.
198 # The library search path needs to be amended so these will be found
199 # during module import. Use BEGINLIBPATH so that these are at the start
200 # of the library search path.
201 if sys
.platform
== 'os2emx':
202 dllpath
= os
.path
.join(sys
.prefix
, "Lib", "lib-dynload")
203 libpath
= os
.environ
['BEGINLIBPATH'].split(';')
205 libpath
.append(dllpath
)
207 libpath
[-1] = dllpath
208 os
.environ
['BEGINLIBPATH'] = ';'.join(libpath
)
211 # Define new built-ins 'quit' and 'exit'.
212 # These are simply strings that display a hint on how to exit.
214 exit
= 'Use Cmd-Q to quit.'
216 exit
= 'Use Ctrl-Z plus Return to exit.'
218 exit
= 'Use Ctrl-D (i.e. EOF) to exit.'
220 __builtin__
.quit
= __builtin__
.exit
= exit
223 # interactive prompt objects for printing the license text, a list of
224 # contributors and the copyright notice.
228 def __init__(self
, name
, data
, files
=(), dirs
=()):
239 for dir in self
.__dirs
:
240 for file in self
.__files
:
241 file = os
.path
.join(dir, file)
253 self
.__lines
= data
.split('\n')
254 self
.__linecnt
= len(self
.__lines
)
258 if len(self
.__lines
) <= self
.MAXLINES
:
259 return "\n".join(self
.__lines
)
261 return "Type %s() to see the full %s text" % ((self
.__name
,)*2)
265 prompt
= 'Hit Return for more, or q (and Return) to quit: '
269 for i
in range(lineno
, lineno
+ self
.MAXLINES
):
270 print self
.__lines
[i
]
274 lineno
+= self
.MAXLINES
277 key
= raw_input(prompt
)
278 if key
not in ('', 'q'):
283 __builtin__
.copyright
= _Printer("copyright", sys
.copyright
)
284 if sys
.platform
[:4] == 'java':
285 __builtin__
.credits
= _Printer(
287 "Jython is maintained by the Jython developers (www.jython.org).")
289 __builtin__
.credits
= _Printer("credits", """\
290 Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
291 for supporting Python development. See www.python.org for more information.""")
292 here
= os
.path
.dirname(os
.__file
__)
293 __builtin__
.license
= _Printer(
294 "license", "See http://www.python.org/%.3s/license.html" % sys
.version
,
295 ["LICENSE.txt", "LICENSE"],
296 [os
.path
.join(here
, os
.pardir
), here
, os
.curdir
])
299 # Define new built-in 'help'.
300 # This is a wrapper around pydoc.help (with a twist).
304 return "Type help() for interactive help, " \
305 "or help(object) for help about object."
306 def __call__(self
, *args
, **kwds
):
308 return pydoc
.help(*args
, **kwds
)
310 __builtin__
.help = _Helper()
313 # On Windows, some default encodings are not provided
314 # by Python (e.g. "cp932" in Japanese locale), while they
315 # are always available as "mbcs" in each locale.
316 # Make them usable by aliasing to "mbcs" in such a case.
318 if sys
.platform
== 'win32':
319 import locale
, codecs
320 enc
= locale
.getdefaultlocale()[1]
321 if enc
.startswith('cp'): # "cp***" ?
326 encodings
._cache
[enc
] = encodings
._unknown
327 encodings
.aliases
.aliases
[enc
] = 'mbcs'
329 # Set the string encoding used by the Unicode implementation. The
330 # default is 'ascii', but if you're willing to experiment, you can
333 encoding
= "ascii" # Default value set by _PyUnicode_Init()
336 # Enable to support locale aware default string encodings.
338 loc
= locale
.getdefaultlocale()
343 # Enable to switch off string to Unicode coercion and implicit
344 # Unicode to string conversion.
345 encoding
= "undefined"
347 if encoding
!= "ascii":
348 # On Non-Unicode builds this will raise an AttributeError...
349 sys
.setdefaultencoding(encoding
) # Needs Python Unicode build !
352 # Run custom site specific code, if available.
360 # Remove sys.setdefaultencoding() so that users cannot change the
361 # encoding after initialization. The test for presence is needed when
362 # this module is run as a script, because this code is executed twice.
364 if hasattr(sys
, "setdefaultencoding"):
365 del sys
.setdefaultencoding
373 if __name__
== '__main__':