]> granicus.if.org Git - python/commitdiff
Revamped, to match py_compile.py:
authorGuido van Rossum <guido@python.org>
Mon, 19 Jan 1998 23:07:55 +0000 (23:07 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 19 Jan 1998 23:07:55 +0000 (23:07 +0000)
- added docstrings
- support option to specify a different purported directory name
- reindented with 4 spaces

Lib/compileall.py

index 9947569eb3d6aa9cfe0efa6cde075eb526a2e88f..f40d0ca4efe46f4dd237e8a2f0bb79afb8ab1052 100644 (file)
-# 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.
+"""Module/script to "compile" all .py files to .pyc (or .pyo) file.
+
+When called as a script with arguments, this compiles the directories
+given as arguments recursively; the -l option prevents it from
+recursing into directories.
+
+Without arguments, if compiles all modules on sys.path, without
+recursing into subdirectories.  (Even though it should do so for
+packages -- for now, you'll have to deal with packages separately.)
+
+See module py_compile for details of the actual byte-compilation.
+
+"""
 
 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_dir(dir, maxlevels=10, ddir=None):
+    """Byte-compile all modules in the given directory tree.
+
+    Arguments (only dir is required):
+
+    dir:       the directory to byte-compile
+    maxlevels: maximum recursion level (default 10)
+    ddir:      if given, purported directory name (this is the
+               directory name that will show up in error messages)
 
-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)
+    """
+    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 ddir:
+           dfile = os.path.join(ddir, name)
+       else:
+           dfile = None
+       if os.path.isfile(fullname):
+           head, tail = name[:-3], name[-3:]
+           if tail == '.py':
+               print 'Compiling', fullname, '...'
+               try:
+                   py_compile.compile(fullname, None, dfile)
+               except KeyboardInterrupt:
+                   raise KeyboardInterrupt
+               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, dfile)
+
+def compile_path(skip_curdir=1, maxlevels=0):
+    """Byte-compile all module on sys.path.
+
+    Arguments (all optional):
+
+    skip_curdir: if true, skip current directory (default true)
+    maxlevels:   max recursion level (default 0)
+
+    """
+    for dir in sys.path:
+       if (not dir or dir == os.curdir) and skip_curdir:
+           print 'Skipping current directory'
+       else:
+           compile_dir(dir, maxlevels)
 
 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
+    """Script main program."""
+    import getopt
+    try:
+       opts, args = getopt.getopt(sys.argv[1:], 'ld:')
+    except getopt.error, msg:
+       print msg
+       print "usage: compileall [-l] [-d destdir] [directory ...]"
+       print "-l: don't recurse down"
+       print "-d destdir: purported directory name for error messages"
+       print "if no arguments, -l sys.path is assumed"
+       sys.exit(2)
+    maxlevels = 10
+    ddir = None
+    for o, a in opts:
+       if o == '-l': maxlevels = 0
+       if o == '-d': ddir = a
+    if ddir:
+       if len(args) != 1:
+           print "-d destdir require exactly one directory argument"
+           sys.exit(2)
+    try:
        if args:
-               for dir in sys.argv[1:]:
-                       compile_dir(dir, maxlevels)
+           for dir in args:
+               compile_dir(dir, maxlevels, ddir)
        else:
-               compile_path()
+           compile_path()
+    except KeyboardInterrupt:
+       print "\n[interrupt]"
 
 if __name__ == '__main__':
-       main()
+    main()