Mercurial > cpython-lru_cache-weakref
annotate Tools/freeze/findmodules.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 | 234817652db0 |
| children |
| rev | line source |
|---|---|
|
1925
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 # Determine the names and filenames of the modules imported by a |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 # script, recursively. This is done by scanning for lines containing |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 # import statements. (The scanning has only superficial knowledge of |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 # Python syntax and no knowledge of semantics, so in theory the result |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 # may be incorrect -- however this is quite unlikely if you don't |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 # intentionally obscure your Python code.) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
7 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 import os |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
9 import regex |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 import string |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
11 import sys |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
12 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
13 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
14 # Top-level interface. |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
15 # First argument is the main program (script). |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
16 # Second optional argument is list of modules to be searched as well. |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
18 def findmodules(scriptfile, modules = [], path = sys.path): |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
19 todo = {} |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
20 todo['__main__'] = scriptfile |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
21 for name in modules: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
22 mod = os.path.basename(name) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
23 if mod[-3:] == '.py': mod = mod[:-3] |
|
1933
234817652db0
Lots of things added. README written (mostly).
Guido van Rossum <guido@python.org>
parents:
1927
diff
changeset
|
24 elif mod[-4:] == '.pyc': mod = mod[:-4] |
|
1925
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
25 todo[mod] = name |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
26 done = closure(todo) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
27 return done |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
28 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
29 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
30 # Compute the closure of scanfile() and findmodule(). |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
31 # Return a dictionary mapping module names to filenames. |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
32 # Writes to stderr if a file can't be or read. |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
33 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
34 def closure(todo): |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
35 done = {} |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
36 while todo: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
37 newtodo = {} |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
38 for modname in todo.keys(): |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
39 if not done.has_key(modname): |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
40 filename = todo[modname] |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
41 if filename is None: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
42 filename = findmodule(modname) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
43 done[modname] = filename |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
44 if filename in ('<builtin>', '<unknown>'): |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
45 continue |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
46 try: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
47 modules = scanfile(filename) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
48 except IOError, msg: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
49 sys.stderr.write("%s: %s\n" % |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
50 (filename, str(msg))) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
51 continue |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
52 for m in modules: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 if not done.has_key(m): |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
54 newtodo[m] = None |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
55 todo = newtodo |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
56 return done |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
57 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
58 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
59 # Scan a file looking for import statements. |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
60 # Return list of module names. |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
61 # Can raise IOError. |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
62 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
63 importstr = '\(^\|:\)[ \t]*import[ \t]+\([a-zA-Z0-9_, \t]+\)' |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
64 fromstr = '\(^\|:\)[ \t]*from[ \t]+\([a-zA-Z0-9_]+\)[ \t]+import[ \t]+' |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
65 isimport = regex.compile(importstr) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
66 isfrom = regex.compile(fromstr) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
67 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
68 def scanfile(filename): |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
69 allmodules = {} |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
70 f = open(filename, 'r') |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
71 try: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
72 while 1: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
73 line = f.readline() |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
74 if not line: break # EOF |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
75 while line[-2:] == '\\\n': # Continuation line |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
76 line = line[:-2] + ' ' |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
77 line = line + f.readline() |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
78 if isimport.search(line) >= 0: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
79 rawmodules = isimport.group(2) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
80 modules = string.splitfields(rawmodules, ',') |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
81 for i in range(len(modules)): |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
82 modules[i] = string.strip(modules[i]) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
83 elif isfrom.search(line) >= 0: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
84 modules = [isfrom.group(2)] |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
85 else: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
86 continue |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
87 for mod in modules: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
88 allmodules[mod] = None |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
89 finally: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
90 f.close() |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
91 return allmodules.keys() |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
92 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
93 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
94 # Find the file containing a module, given its name. |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
95 # Return filename, or '<builtin>', or '<unknown>'. |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
96 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
97 builtins = sys.builtin_module_names |
|
1927
e56afd03ca7f
Don't search for *.so modules since we can't handle them!
Guido van Rossum <guido@python.org>
parents:
1925
diff
changeset
|
98 tails = ['.py', '.pyc'] |
|
1925
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
99 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
100 def findmodule(modname, path = sys.path): |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
101 if modname in builtins: return '<builtin>' |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
102 for dirname in path: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
103 for tail in tails: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
104 fullname = os.path.join(dirname, modname + tail) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
105 try: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
106 f = open(fullname, 'r') |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
107 except IOError: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
108 continue |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
109 f.close() |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
110 return fullname |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
111 return '<unknown>' |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
112 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
113 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
114 # Test the above functions. |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
115 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
116 def test(): |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
117 if not sys.argv[1:]: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
118 print 'usage: python findmodules.py scriptfile [morefiles ...]' |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
119 sys.exit(2) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
120 done = findmodules(sys.argv[1], sys.argv[2:]) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
121 items = done.items() |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
122 items.sort() |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
123 for mod, file in [('Module', 'File')] + items: |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
124 print "%-15s %s" % (mod, file) |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
125 |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
126 if __name__ == '__main__': |
|
a1aba4d45893
Totally new "freeze" program.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
127 test() |
