compileall - Compila in Bytecode i File Sorgente

Scopo Converte i file sorgente nella versione compilata bytecode
Versione Python 1.4

Il modulo compileall cerca i file sorgente e li compila nella loro rappresentazione bytecode , salvando il risultato in file con suffisso .pyc oppure .pyo .

Compilare una directory

Si usa compile_dir() per scorrere una directory in modo ricorsivo e compilare in bytecode i file contenuti.

import compileall

compileall.compile_dir('examples')

Nella modalità predefinita, sono esaminate tutte le sottodirectory fino alla profondità di 10. Quando si usa un sistema di controllo di versione tipo subversion la cosa può condurre ad una scansione non necessaria, come si vede qui:

$ python compileall_compile_dir.py

Listing examples ...
Listing examples/.svn ...
Listing examples/.svn/prop-base ...
Listing examples/.svn/text-base ...
Compiling examples/a.py ...
Listing examples/subdir ...
Listing examples/subdir/.svn ...
Listing examples/subdir/.svn/prop-base ...
Listing examples/subdir/.svn/text-base ...
Compiling examples/subdir/b.py ...

Per escludere le directory si uilizza l'argomento rx per passare una espressione regolare che trovi corrispondenza con i nomi da escludere.

import compileall
import re

compileall.compile_dir('examples',
    rx=re.compile(r'/\.svn'))
$ python compileall_exclude_dirs.py

Listing examples ...
Listing examples/.svn ...
Listing examples/.svn/prop-base ...
Listing examples/.svn/text-base ...
Compiling examples/a.py ...
Listing examples/subdir ...
Listing examples/subdir/.svn ...
Listing examples/subdir/.svn/prop-base ...
Listing examples/subdir/.svn/text-base ...
Compiling examples/subdir/b.py ...

L'argomento maxlevels controlla la profondità della ricorsione. Ad esempio, per evitare completamente la ricorsione passare 0

import compileall
import re

compileall.compile_dir('examples',
    maxlevels=0,
    rx=re.compile(r'/\.svn'))
$ python compileall_recursion_depth.py

Listing examples ...
Compiling examples/a.py ...

Compilare sys.path

Tutti i file sorgente trovati in sys.path possono essere compilati con una singola chiamata a compile_path() .

import compileall
import sys

sys.path[:] = ['examples', 'nientequi']
print 'sys.path =', sys.path
compileall.compile_path()

Questo esempio sostituisce il contenuto predefinito di sys.path per evitare errori di permessi quando si esegue lo script, tuttavia dimostra comunque il comportamento predefinito. Si noti che il valore di maxlevels viene predefinito come 0 .

$ python compileall_path.py

sys.path = ['examples', 'nientequi']
Listing examples ...
Listing nientequi ...
Can't list nientequi

Da Riga di Comando

E' anche possibile chiamare compileall da riga di comando, come si potrebbe fare quando lo si vuole integrare con un sistema di compilazione tramite un Makefile . Ad esempio:

$ python -m compileall -h

option -h not recognized
usage: python compileall.py [-l] [-f] [-q] [-d destdir] [-x regexp] [-i list] [directory|file ...]

arguments: zero or more file and directory names to compile; if no arguments given,
           defaults to the equivalent of -l sys.path

options:
-l: don't recurse into subdirectories
-f: force rebuild even if timestamps are up-to-date
-q: output only error messages
-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 regexp; 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

Per ricreare l'esempio qui sopra, saltando le directory .svn si dovrebbe eseguire:

$ python -m compileall -x '/\.svn' examples

Listing examples ...
Listing examples/.svn ...
Listing examples/.svn/prop-base ...
Listing examples/.svn/text-base ...
Compiling examples/a.py ...
Listing examples/subdir ...
Listing examples/subdir/.svn ...
Listing examples/subdir/.svn/prop-base ...
Listing examples/subdir/.svn/text-base ...
Compiling examples/subdir/b.py ...

Vedere anche:

compileall
La documentazione della libreria standard per questo modulo