Scopo | Converte i file sorgente nella versione compilata bytecode |
Versione Python | 1.4 |
A partire dal 1 gennaio 2021 le versioni 2.x di Python non sono piu' supportate. Ti invito a consultare la corrispondente versione 3.x dell'articolo per il modulo compileall
Il modulo
compileall
cerca i file sorgente e li compila nella loro rappresentazione
bytecode
, salvando il risultato in file con suffisso
.pyc
oppure
.pyo
.
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 ...
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
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: