| # Routines to force "compilation" of all .py files in a directory | 
 | # tree or on sys.path.  By default recursion is pruned at a depth of | 
 | # 10 and the current directory, if it occurs in sys.path, is skipped. | 
 | # When called as a script, compiles argument directories, or sys.path | 
 | # if no arguments. | 
 | # After a similar module by Sjoerd Mullender. | 
 |  | 
 | import os | 
 | import sys | 
 | import py_compile | 
 |  | 
 | def compile_dir(dir, maxlevels = 10): | 
 | 	print 'Listing', dir, '...' | 
 | 	try: | 
 | 		names = os.listdir(dir) | 
 | 	except os.error: | 
 | 		print "Can't list", dir | 
 | 		names = [] | 
 | 	names.sort() | 
 | 	for name in names: | 
 | 		fullname = os.path.join(dir, name) | 
 | 		if os.path.isfile(fullname): | 
 | 			head, tail = name[:-3], name[-3:] | 
 | 			if tail == '.py': | 
 | 				print 'Compiling', fullname, '...' | 
 | 				try: | 
 | 					py_compile.compile(fullname) | 
 | 				except KeyboardInterrupt: | 
 | 					del names[:] | 
 | 					print '\n[interrupt]' | 
 | 					break | 
 | 				except: | 
 | 					if type(sys.exc_type) == type(''): | 
 | 						exc_type_name = sys.exc_type | 
 | 					else: exc_type_name = sys.exc_type.__name__ | 
 | 					print 'Sorry:', exc_type_name + ':', | 
 | 					print sys.exc_value | 
 | 		elif maxlevels > 0 and \ | 
 | 		     name != os.curdir and name != os.pardir and \ | 
 | 		     os.path.isdir(fullname) and \ | 
 | 		     not os.path.islink(fullname): | 
 | 			compile_dir(fullname, maxlevels - 1) | 
 |  | 
 | def compile_path(skip_curdir = 1): | 
 | 	for dir in sys.path: | 
 | 		if (not dir or dir == os.curdir) and skip_curdir: | 
 | 			print 'Skipping current directory' | 
 | 		else: | 
 | 			compile_dir(dir, 0) | 
 |  | 
 | def main(): | 
 | 	import getopt | 
 | 	try: | 
 | 		opts, args = getopt.getopt(sys.argv[1:], 'l') | 
 | 	except getopt.error, msg: | 
 | 		print msg | 
 | 		print "usage: compileall [-l] [directory ...]" | 
 | 		print "-l: don't recurse down" | 
 | 		print "if no arguments, -l sys.path is assumed" | 
 | 	maxlevels = 10 | 
 | 	for o, a in opts: | 
 | 		if o == '-l': maxlevels = 0 | 
 | 	if args: | 
 | 		for dir in sys.argv[1:]: | 
 | 			compile_dir(dir, maxlevels) | 
 | 	else: | 
 | 		compile_path() | 
 |  | 
 | if __name__ == '__main__': | 
 | 	main() |