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:
Guido van Rossum 1997-08-29 22:30:45 +00:00
parent 83b6709d8e
commit f30bec7bb2
1 changed files with 103 additions and 28 deletions

View File

@ -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:
if prefix:
sitedir = os.path.join(prefix, os.path.join("lib", "site-python"))
if sitedir not in sys.path and os.path.isdir(sitedir):
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:
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()