blob: 9947569eb3d6aa9cfe0efa6cde075eb526a2e88f [file] [log] [blame]
Guido van Rossum3bb54481994-08-29 10:52:58 +00001# Routines to force "compilation" of all .py files in a directory
2# tree or on sys.path. By default recursion is pruned at a depth of
3# 10 and the current directory, if it occurs in sys.path, is skipped.
4# When called as a script, compiles argument directories, or sys.path
5# if no arguments.
6# After a similar module by Sjoerd Mullender.
7
8import os
9import sys
10import py_compile
11
12def compile_dir(dir, maxlevels = 10):
13 print 'Listing', dir, '...'
14 try:
15 names = os.listdir(dir)
16 except os.error:
17 print "Can't list", dir
18 names = []
19 names.sort()
20 for name in names:
21 fullname = os.path.join(dir, name)
22 if os.path.isfile(fullname):
23 head, tail = name[:-3], name[-3:]
24 if tail == '.py':
25 print 'Compiling', fullname, '...'
26 try:
27 py_compile.compile(fullname)
28 except KeyboardInterrupt:
29 del names[:]
30 print '\n[interrupt]'
31 break
32 except:
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000033 if type(sys.exc_type) == type(''):
34 exc_type_name = sys.exc_type
35 else: exc_type_name = sys.exc_type.__name__
36 print 'Sorry:', exc_type_name + ':',
Guido van Rossum3bb54481994-08-29 10:52:58 +000037 print sys.exc_value
38 elif maxlevels > 0 and \
39 name != os.curdir and name != os.pardir and \
40 os.path.isdir(fullname) and \
41 not os.path.islink(fullname):
42 compile_dir(fullname, maxlevels - 1)
43
44def compile_path(skip_curdir = 1):
45 for dir in sys.path:
Guido van Rossum68f56e41996-07-31 21:18:42 +000046 if (not dir or dir == os.curdir) and skip_curdir:
Guido van Rossum3bb54481994-08-29 10:52:58 +000047 print 'Skipping current directory'
48 else:
49 compile_dir(dir, 0)
50
51def main():
52 import getopt
53 try:
54 opts, args = getopt.getopt(sys.argv[1:], 'l')
55 except getopt.error, msg:
56 print msg
57 print "usage: compileall [-l] [directory ...]"
58 print "-l: don't recurse down"
59 print "if no arguments, -l sys.path is assumed"
60 maxlevels = 10
61 for o, a in opts:
62 if o == '-l': maxlevels = 0
63 if args:
64 for dir in sys.argv[1:]:
65 compile_dir(dir, maxlevels)
66 else:
67 compile_path()
68
69if __name__ == '__main__':
70 main()