summaryrefslogtreecommitdiffstats
path: root/Lib/addpack.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1994-03-07 11:45:36 (GMT)
committerGuido van Rossum <guido@python.org>1994-03-07 11:45:36 (GMT)
commitd1df83ba6c2c7dfb6e792c46e3fccb2c1d2310cc (patch)
tree71c6365321dc509011e2953e428cfd7df4c2c0cc /Lib/addpack.py
parentd66acb45f8b44495379e20a4eceb2eea1ec921b2 (diff)
downloadcpython-d1df83ba6c2c7dfb6e792c46e3fccb2c1d2310cc.zip
cpython-d1df83ba6c2c7dfb6e792c46e3fccb2c1d2310cc.tar.gz
cpython-d1df83ba6c2c7dfb6e792c46e3fccb2c1d2310cc.tar.bz2
urlopen: add basejoin() function.
addpack: new module to add packages to sys.path.
Diffstat (limited to 'Lib/addpack.py')
-rw-r--r--Lib/addpack.py67
1 files changed, 67 insertions, 0 deletions
diff --git a/Lib/addpack.py b/Lib/addpack.py
new file mode 100644
index 0000000..3d09236
--- /dev/null
+++ b/Lib/addpack.py
@@ -0,0 +1,67 @@
+# This module provides standard support for "packages".
+#
+# The idea is that large groups of related modules can be placed in
+# their own subdirectory, which can be added to the Python search path
+# in a relatively easy way.
+#
+# The current version takes a package name and searches the Python
+# search path for a directory by that name, and if found adds it to
+# the module search path (sys.path). It maintains a list of packages
+# that have already been added so adding the same package many times
+# is OK.
+#
+# It is intended to be used in a fairly stylized manner: each module
+# that wants to use a particular package, say 'Foo', is supposed to
+# contain the following code:
+#
+# from addpack import addpack
+# addpack('Foo')
+# <import modules from package Foo>
+#
+# Additional arguments, when present, provide additional places where
+# to look for the package before trying sys.path (these may be either
+# strings or lists/tuples of strings). Also, if the package name is a
+# full pathname, first the last component is tried in the usual way,
+# then the full pathname is tried last. If the package name is a
+# *relative* pathname (UNIX: contains a slash but doesn't start with
+# one), then nothing special is done. The packages "/foo/bar/bletch"
+# and "bletch" are considered the same, but unrelated to "bar/bletch".
+#
+# If the algorithm finds more than one suitable subdirectory, all are
+# added to the search path -- this makes it possible to override part
+# of a package. The same path will not be added more than once.
+#
+# If no directory is found, ImportError is raised.
+
+_packs = {} # {pack: [pathname, ...], ...}
+
+def addpack(pack, *locations):
+ import os
+ if os.path.isabs(pack):
+ base = os.path.basename(pack)
+ else:
+ base = pack
+ if _packs.has_key(base):
+ return
+ import sys
+ path = []
+ for loc in _flatten(locations) + sys.path:
+ fn = os.path.join(loc, base)
+ if fn not in path and os.path.isdir(fn):
+ path.append(fn)
+ if pack != base and pack not in path and os.path.isdir(pack):
+ path.append(pack)
+ if not path: raise ImportError, 'package ' + pack + ' not found'
+ _packs[base] = path
+ for fn in path:
+ if fn not in sys.path:
+ sys.path.append(fn)
+
+def _flatten(locations):
+ locs = []
+ for loc in locations:
+ if type(loc) == type(''):
+ locs.append(loc)
+ else:
+ locs = locs + _flatten(loc)
+ return locs