mirror of https://github.com/python/cpython
New site.py semantics. Searches in
<*prefix>/lib/python<version>/packages for *.pth files containing directories that are appended to sys.path.
This commit is contained in:
parent
83b6709d8e
commit
f30bec7bb2
131
Lib/site.py
131
Lib/site.py
|
@ -1,47 +1,122 @@
|
|||
"""Hook to allow easy access to site-specific modules.
|
||||
"""Append module search paths for third-party packages to sys.path.
|
||||
|
||||
Scripts or modules that need to use site-specific modules should place
|
||||
****************************************************************
|
||||
* This module is automatically imported during initialization. *
|
||||
****************************************************************
|
||||
|
||||
import site
|
||||
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).
|
||||
|
||||
somewhere near the top of their code. This will append up to two
|
||||
site-specific paths ($prefix/lib/site-python and
|
||||
$exec_prefix/lib/site-python) to the module search path. ($prefix
|
||||
and $exec_prefix are configuration parameters, and both default
|
||||
to /usr/local; they are accessible in Python as sys.prefix and
|
||||
sys.exec_prefix).
|
||||
This will append site-specific paths to to the module search path. It
|
||||
starts with sys.prefix and sys.exec_prefix (if different) and appends
|
||||
lib/python<version>/packages. The resulting directory, if it exists,
|
||||
is added to sys.path, and also inspected for path configuration files.
|
||||
|
||||
Because of Python's import semantics, it is okay for more than one
|
||||
module to import site -- only the first one will execute the site
|
||||
customizations. The directories are only appended to the path if they
|
||||
exist and are not already on it.
|
||||
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.
|
||||
|
||||
Sites that wish to provide site-specific modules should place them in
|
||||
one of the site specific directories; $prefix/lib/site-python is for
|
||||
Python source code and $exec_prefix/lib/site-python is for dynamically
|
||||
loadable extension modules (shared libraries).
|
||||
For example, suppose sys.prefix and sys.exec_prefix are set to
|
||||
/usr/local and there is a directory /usr/local/python1.5/packages with
|
||||
three subdirectories, foo, bar and spam, and two path configuration
|
||||
files, foo.pth and bar.pth. Assume foo.pth contains the following:
|
||||
|
||||
# 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:
|
||||
|
||||
/usr/local/lib/python1.5/packages/bar
|
||||
/usr/local/lib/python1.5/packages/foo
|
||||
|
||||
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.
|
||||
|
||||
After these path manipulations, an attempt is made to import a module
|
||||
named sitecustomize, which can perform arbitrary site-specific
|
||||
customizations. If this import fails with an ImportError exception,
|
||||
it is ignored.
|
||||
named sitecustomize, which can perform arbitrary additional
|
||||
site-specific customizations. If this import fails with an
|
||||
ImportError exception, it is silently ignored.
|
||||
|
||||
Note that for non-Unix systems, sys.prefix and sys.exec_prefix are
|
||||
empty, and the path manipulations are skipped; however the import of
|
||||
sitecustomize is still attempted.
|
||||
Note that for some non-Unix systems, sys.prefix and sys.exec_prefix
|
||||
are empty, and then the path manipulations are skipped; however the
|
||||
import of sitecustomize is still attempted.
|
||||
|
||||
XXX Any suggestions as to how to handle this for non-Unix systems???
|
||||
"""
|
||||
|
||||
print "loading site.py"
|
||||
|
||||
import sys, os
|
||||
|
||||
for prefix in sys.prefix, sys.exec_prefix:
|
||||
def addsitedir(sitedir):
|
||||
if sitedir not in sys.path:
|
||||
sys.path.append(sitedir) # Add path component
|
||||
try:
|
||||
names = os.listdir(sitedir)
|
||||
except os.error:
|
||||
return
|
||||
names = map(os.path.normcase, names)
|
||||
names.sort()
|
||||
for name in names:
|
||||
if name[-4:] == ".pth":
|
||||
addpackage(sitedir, name)
|
||||
|
||||
def addpackage(sitedir, name):
|
||||
fullname = os.path.join(sitedir, name)
|
||||
try:
|
||||
f = open(fullname)
|
||||
except IOError:
|
||||
return
|
||||
while 1:
|
||||
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)
|
||||
|
||||
prefixes = [sys.prefix]
|
||||
if sys.exec_prefix != sys.prefix:
|
||||
prefixes.append(sys.exec_prefix)
|
||||
for prefix in prefixes:
|
||||
if prefix:
|
||||
sitedir = os.path.join(prefix, os.path.join("lib", "site-python"))
|
||||
if sitedir not in sys.path and os.path.isdir(sitedir):
|
||||
sys.path.append(sitedir) # Add path component
|
||||
if sys.platform[:3] in ('win', 'mac'):
|
||||
sitedir = prefix
|
||||
else:
|
||||
sitedir = os.path.join(prefix,
|
||||
"lib",
|
||||
"python" + sys.version[:3],
|
||||
"packages")
|
||||
if os.path.isdir(sitedir):
|
||||
addsitedir(sitedir)
|
||||
|
||||
try:
|
||||
import sitecustomize # Run arbitrary site specific code
|
||||
except ImportError:
|
||||
pass # No site customization module
|
||||
|
||||
def _test():
|
||||
print "sys.path = ["
|
||||
for dir in sys.path:
|
||||
print " %s," % `dir`
|
||||
print "]"
|
||||
|
||||
if __name__ == '__main__':
|
||||
_test()
|
||||
|
|
Loading…
Reference in New Issue