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