annotate Lib/lib-old/addpack.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 91f846f6d6a6
children c3a096bfbd6b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1572
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # This module provides standard support for "packages".
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 #
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # The idea is that large groups of related modules can be placed in
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # their own subdirectory, which can be added to the Python search path
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # in a relatively easy way.
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # The current version takes a package name and searches the Python
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # search path for a directory by that name, and if found adds it to
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # the module search path (sys.path). It maintains a list of packages
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 # that have already been added so adding the same package many times
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # is OK.
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 #
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 # It is intended to be used in a fairly stylized manner: each module
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 # that wants to use a particular package, say 'Foo', is supposed to
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 # contain the following code:
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 #
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 # from addpack import addpack
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 # addpack('Foo')
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 # <import modules from package Foo>
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 #
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 # Additional arguments, when present, provide additional places where
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 # to look for the package before trying sys.path (these may be either
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 # strings or lists/tuples of strings). Also, if the package name is a
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 # full pathname, first the last component is tried in the usual way,
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 # then the full pathname is tried last. If the package name is a
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 # *relative* pathname (UNIX: contains a slash but doesn't start with
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 # one), then nothing special is done. The packages "/foo/bar/bletch"
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 # and "bletch" are considered the same, but unrelated to "bar/bletch".
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 #
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 # If the algorithm finds more than one suitable subdirectory, all are
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 # added to the search path -- this makes it possible to override part
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 # of a package. The same path will not be added more than once.
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 #
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 # If no directory is found, ImportError is raised.
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
35
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 _packs = {} # {pack: [pathname, ...], ...}
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
37
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 def addpack(pack, *locations):
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 import os
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 if os.path.isabs(pack):
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 base = os.path.basename(pack)
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 else:
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 base = pack
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 if _packs.has_key(base):
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 return
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 import sys
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 path = []
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 for loc in _flatten(locations) + sys.path:
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 fn = os.path.join(loc, base)
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 if fn not in path and os.path.isdir(fn):
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 path.append(fn)
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 if pack != base and pack not in path and os.path.isdir(pack):
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 path.append(pack)
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 if not path: raise ImportError, 'package ' + pack + ' not found'
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 _packs[base] = path
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 for fn in path:
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 if fn not in sys.path:
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 sys.path.append(fn)
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
59
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 def _flatten(locations):
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 locs = []
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 for loc in locations:
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 if type(loc) == type(''):
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 locs.append(loc)
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 else:
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 locs = locs + _flatten(loc)
91f846f6d6a6 urlopen: add basejoin() function.
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 return locs