Commit f30bec7b authored by Guido van Rossum's avatar Guido van Rossum

New site.py semantics. Searches in

<*prefix>/lib/python<version>/packages for *.pth files containing
directories that are appended to sys.path.
parent 83b6709d
"""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 This will append site-specific paths to to the module search path. It
site-specific paths ($prefix/lib/site-python and starts with sys.prefix and sys.exec_prefix (if different) and appends
$exec_prefix/lib/site-python) to the module search path. ($prefix lib/python<version>/packages. The resulting directory, if it exists,
and $exec_prefix are configuration parameters, and both default is added to sys.path, and also inspected for path configuration files.
to /usr/local; they are accessible in Python as sys.prefix and
sys.exec_prefix).
Because of Python's import semantics, it is okay for more than one A path configuration file is a file whose name has the form
module to import site -- only the first one will execute the site <package>.pth; its contents are additional directories (one per line)
customizations. The directories are only appended to the path if they to be added to sys.path. Non-existing directories (or
exist and are not already on it. 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 For example, suppose sys.prefix and sys.exec_prefix are set to
one of the site specific directories; $prefix/lib/site-python is for /usr/local and there is a directory /usr/local/python1.5/packages with
Python source code and $exec_prefix/lib/site-python is for dynamically three subdirectories, foo, bar and spam, and two path configuration
loadable extension modules (shared libraries). 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 After these path manipulations, an attempt is made to import a module
named sitecustomize, which can perform arbitrary site-specific named sitecustomize, which can perform arbitrary additional
customizations. If this import fails with an ImportError exception, site-specific customizations. If this import fails with an
it is ignored. ImportError exception, it is silently ignored.
Note that for non-Unix systems, sys.prefix and sys.exec_prefix are Note that for some non-Unix systems, sys.prefix and sys.exec_prefix
empty, and the path manipulations are skipped; however the import of are empty, and then the path manipulations are skipped; however the
sitecustomize is still attempted. 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 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: if prefix:
sitedir = os.path.join(prefix, os.path.join("lib", "site-python")) if sys.platform[:3] in ('win', 'mac'):
if sitedir not in sys.path and os.path.isdir(sitedir): sitedir = prefix
sys.path.append(sitedir) # Add path component else:
sitedir = os.path.join(prefix,
"lib",
"python" + sys.version[:3],
"packages")
if os.path.isdir(sitedir):
addsitedir(sitedir)
try: try:
import sitecustomize # Run arbitrary site specific code import sitecustomize # Run arbitrary site specific code
except ImportError: except ImportError:
pass # No site customization module pass # No site customization module
def _test():
print "sys.path = ["
for dir in sys.path:
print " %s," % `dir`
print "]"
if __name__ == '__main__':
_test()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment