blob: f695b3aa8415d2a1888ba511ea2cf92a64acd06b [file] [log] [blame]
Guido van Rossum548703a1998-03-26 22:14:20 +00001"""Module/script to "compile" all .py files to .pyc (or .pyo) file.
2
3When called as a script with arguments, this compiles the directories
4given as arguments recursively; the -l option prevents it from
5recursing into directories.
6
7Without arguments, if compiles all modules on sys.path, without
8recursing into subdirectories. (Even though it should do so for
9packages -- for now, you'll have to deal with packages separately.)
10
11See module py_compile for details of the actual byte-compilation.
12
13"""
Guido van Rossum5c971671996-07-22 15:23:25 +000014
15import os
16import sys
17import py_compile
18
Guido van Rossum548703a1998-03-26 22:14:20 +000019def compile_dir(dir, maxlevels=10, ddir=None):
20 """Byte-compile all modules in the given directory tree.
Guido van Rossum5c971671996-07-22 15:23:25 +000021
Guido van Rossum548703a1998-03-26 22:14:20 +000022 Arguments (only dir is required):
23
24 dir: the directory to byte-compile
25 maxlevels: maximum recursion level (default 10)
26 ddir: if given, purported directory name (this is the
27 directory name that will show up in error messages)
28
29 """
30 print 'Listing', dir, '...'
31 try:
32 names = os.listdir(dir)
33 except os.error:
34 print "Can't list", dir
35 names = []
36 names.sort()
37 for name in names:
38 fullname = os.path.join(dir, name)
39 if ddir:
40 dfile = os.path.join(ddir, name)
41 else:
42 dfile = None
43 if os.path.isfile(fullname):
44 head, tail = name[:-3], name[-3:]
45 if tail == '.py':
46 print 'Compiling', fullname, '...'
47 try:
48 py_compile.compile(fullname, None, dfile)
49 except KeyboardInterrupt:
50 raise KeyboardInterrupt
51 except:
52 if type(sys.exc_type) == type(''):
53 exc_type_name = sys.exc_type
54 else: exc_type_name = sys.exc_type.__name__
55 print 'Sorry:', exc_type_name + ':',
56 print sys.exc_value
57 elif maxlevels > 0 and \
58 name != os.curdir and name != os.pardir and \
59 os.path.isdir(fullname) and \
60 not os.path.islink(fullname):
61 compile_dir(fullname, maxlevels - 1, dfile)
62
63def compile_path(skip_curdir=1, maxlevels=0):
64 """Byte-compile all module on sys.path.
65
66 Arguments (all optional):
67
68 skip_curdir: if true, skip current directory (default true)
69 maxlevels: max recursion level (default 0)
70
71 """
72 for dir in sys.path:
73 if (not dir or dir == os.curdir) and skip_curdir:
74 print 'Skipping current directory'
75 else:
76 compile_dir(dir, maxlevels)
Guido van Rossum5c971671996-07-22 15:23:25 +000077
78def main():
Guido van Rossum548703a1998-03-26 22:14:20 +000079 """Script main program."""
80 import getopt
81 try:
82 opts, args = getopt.getopt(sys.argv[1:], 'ld:')
83 except getopt.error, msg:
84 print msg
85 print "usage: compileall [-l] [-d destdir] [directory ...]"
86 print "-l: don't recurse down"
87 print "-d destdir: purported directory name for error messages"
88 print "if no arguments, -l sys.path is assumed"
89 sys.exit(2)
90 maxlevels = 10
91 ddir = None
92 for o, a in opts:
93 if o == '-l': maxlevels = 0
94 if o == '-d': ddir = a
95 if ddir:
96 if len(args) != 1:
97 print "-d destdir require exactly one directory argument"
98 sys.exit(2)
99 try:
100 if args:
101 for dir in args:
102 compile_dir(dir, maxlevels, ddir)
103 else:
104 compile_path()
105 except KeyboardInterrupt:
106 print "\n[interrupt]"
Guido van Rossum5c971671996-07-22 15:23:25 +0000107
108if __name__ == '__main__':
Guido van Rossum548703a1998-03-26 22:14:20 +0000109 main()