compileall.py revision 68f56e45f6e0f5ed48ccfdfc26f3681bb0cb279e
1# 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: 33 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 + ':', 37 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: 46 if (not dir or dir == os.curdir) and skip_curdir: 47 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() 71