compileall — Byte-compile Source Files¶
Purpose: | Convert source files to byte-compiled version. |
---|
The compileall
module finds Python source files and compiles
them to the byte-code representation, saving the results in .pyc
.
Compiling One Directory¶
compile_dir()
is used to recursively scan a directory and
byte-compile the files within it.
import compileall
import glob
def show(title):
print(title)
for filename in glob.glob('examples/**',
recursive=True):
print(' {}'.format(filename))
print()
show('Before')
compileall.compile_dir('examples')
show('\nAfter')
By default, all of the subdirectories are scanned to a depth of 10.
The output files are written to a __pycache__
directory and named
based on the Python interpreter version.
$ python3 compileall_compile_dir.py
Before
examples/
examples/README
examples/a.py
examples/subdir
examples/subdir/b.py
Listing 'examples'...
Compiling 'examples/a.py'...
Listing 'examples/subdir'...
Compiling 'examples/subdir/b.py'...
After
examples/
examples/README
examples/a.py
examples/subdir
examples/subdir/__pycache__
examples/subdir/__pycache__/b.cpython-37.pyc
examples/subdir/b.py
examples/__pycache__
examples/__pycache__/a.cpython-37.pyc
Ignoring Files¶
To filter directories out, use the rx
argument to provide a
regular expression to match the names to exclude.
import compileall
import re
compileall.compile_dir(
'examples',
rx=re.compile(r'/subdir'),
)
This version excludes files in the subdir
subdirectory.
$ python3 compileall_exclude_dirs.py
Listing 'examples'...
Compiling 'examples/a.py'...
Listing 'examples/subdir'...
The maxlevels
argument controls the depth of recursion. For example,
to avoid recursion entirely pass 0
.
import compileall
import re
compileall.compile_dir(
'examples',
maxlevels=0,
)
Only files within the directory passed to compile_dir()
are
compiled.
$ python3 compileall_recursion_depth.py
Listing 'examples'...
Compiling 'examples/a.py'...
Compiling sys.path¶
All of the Python source files found in sys.path can be compiled with
a single call to compile_path()
.
import compileall
import sys
sys.path[:] = ['examples', 'notthere']
print('sys.path =', sys.path)
compileall.compile_path()
This example replaces the default contents of sys.path
to
avoid permission errors while running the script, but still
illustrates the default behavior. Note that the maxlevels
value
defaults to 0
.
$ python3 compileall_path.py
sys.path = ['examples', 'notthere']
Listing 'examples'...
Compiling 'examples/a.py'...
Listing 'notthere'...
Can't list 'notthere'
Compiling Individual Files¶
To compile a single file, rather than an entire directory of files,
use compile_file()
.
import compileall
import glob
def show(title):
print(title)
for filename in glob.glob('examples/**',
recursive=True):
print(' {}'.format(filename))
print()
show('Before')
compileall.compile_file('examples/a.py')
show('\nAfter')
The first argument should be the name to the file, either a full path or a relative path.
$ python3 compileall_compile_file.py
Before
examples/
examples/README
examples/a.py
examples/subdir
examples/subdir/b.py
Compiling 'examples/a.py'...
After
examples/
examples/README
examples/a.py
examples/subdir
examples/subdir/b.py
examples/__pycache__
examples/__pycache__/a.cpython-37.pyc
From the Command Line¶
It is also possible to invoke compileall
from the command line,
so it can be integrated with a build system via a Makefile. For
example:
$ python3 -m compileall -h
usage: compileall.py [-h] [-l] [-r RECURSION] [-f] [-q] [-b] [-d
DESTDIR]
[-x REGEXP] [-i FILE] [-j WORKERS]
[--invalidation-mode
{checked-hash,timestamp,unchecked-hash}]
[FILE|DIR [FILE|DIR ...]]
Utilities to support installing Python libraries.
positional arguments:
FILE|DIR zero or more file and directory names to
compile; if
no arguments given, defaults to the
equivalent of -l
sys.path
optional arguments:
-h, --help show this help message and exit
-l don't recurse into subdirectories
-r RECURSION control the maximum recursion level. if
`-l` and `-r`
options are specified, then `-r` takes
precedence.
-f force rebuild even if timestamps are up
to date
-q output only error messages; -qq will
suppress the
error messages as well.
-b use legacy (pre-PEP3147) compiled file
locations
-d DESTDIR directory to prepend to file paths for
use in compile-
time tracebacks and in runtime
tracebacks in cases
where the source file is unavailable
-x REGEXP skip files matching the regular
expression; the regexp
is searched for in the full path of each
file
considered for compilation
-i FILE add all the files and directories listed
in FILE to
the list considered for compilation; if
"-", names are
read from stdin
-j WORKERS, --workers WORKERS
Run compileall concurrently
--invalidation-mode {checked-hash,timestamp,unchecked-hash}
How the pycs will be invalidated at
runtime
To recreate the earlier example, skipping the subdir
directory, run:
$ python3 -m compileall -x '/subdir' examples
Listing 'examples'...
Compiling 'examples/a.py'...
Listing 'examples/subdir'...