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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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()