Mercurial > cpython-lru_cache-weakref
annotate Lib/lib-old/addpack.py @ 4566:6403c94de50d legacy-trunk
Added safeguard against failure in __del__.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Wed, 27 Nov 1996 19:39:58 +0000 |
| parents | 91f846f6d6a6 |
| children | c3a096bfbd6b |
| 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 |
