compileall - Compilazione in Byte-code di File Sorgente
Scopo: Converte i file sorgente nella versione compilata byte-code
Il modulo compileall cerca file sorgente Python e li compila nella rappresentazione byte-code, salvando il risultato in file con estensione .pyc.
Compilare Una Directory
compile_dir() viene usato per scorrere ricorsivamente una directory e compilare in byte-code i file sorgente Python in essa contenuti.
# compileall_compile_dir.py
import compileall
import glob
def show(title):
print(title)
for filename in glob.glob('esempi/**',
recursive=True):
print(' {}'.format(filename))
print()
show('Prima')
compileall.compile_dir('esempi')
show('\nDopo')
Nella modalità predefinita, vengono esaminate tutte le sottodirectory fino ad una profondità di 10. I file in uscita sono scritti nella directory __pycache__ e nominati in base alla versione dell'interprete Python.
$ python3 compileall_compile_dir.py Prima esempi/ esempi/README esempi/subdir esempi/subdir/b.py esempi/subdir/__pycache__ esempi/subdir/__pycache__/b.cpython-38.pyc esempi/__pycache__ esempi/__pycache__/a.cpython-36.pyc esempi/__pycache__/a.cpython-38.pyc esempi/a.py Listing 'esempi'... Listing 'esempi/subdir'... Dopo esempi/ esempi/README esempi/subdir esempi/subdir/b.py esempi/subdir/__pycache__ esempi/subdir/__pycache__/b.cpython-38.pyc esempi/__pycache__ esempi/__pycache__/a.cpython-36.pyc esempi/__pycache__/a.cpython-38.pyc esempi/a.py
Ignorare i File
Per escludere delle directory, si usi l'argomento rx per fornire una espressione regolare per trovare corrispondenza con i nomi da escludere.
# compileall_exclude_dirs.py
import compileall
import re
compileall.compile_dir(
'esempi',
rx=re.compile(r'/subdir'),
)
Questa versione esclude i file nella sottodirectory subdir.
$ python3 compileall_exclude_dirs.py Listing 'esempi'... Listing 'esempi/subdir'...
L'argomento maxlevels controlla la profondità della ricorsione. Ad esempio, per evitare interamente la ricorsione si passi 0.
# compileall_recursion_depth.py
import compileall
import re
compileall.compile_dir(
'esempi',
maxlevels=0,
)
Solo i file contenuti nelle directory passate a compile_dir() sono compilati.
$ python3 compileall_recursion_depth.py Listing 'esempi'...
Compilare sys.path
Tutti i file sorgente di Python che si trovano in sys.path possono essere compilati con una singola chiamata a compile_path().
# compileall_path.py
import compileall
import sys
sys.path[:] = ['esempi', 'nonqui']
print('sys.path =', sys.path)
compileall.compile_path()
Questo esempio sostituisce il contenuto predefinito di sys.path per evitare errori sui permessi quando si esegue lo script, ma è ancora valido per illustrare il comportamento predefinito. Si noti che il valore predefinito di maxlevels è 0.
$ python3 compileall_path.py sys.path = ['esempi', 'nonqui'] Listing 'esempi'... Listing 'nonqui'... Can't list 'nonqui'
Compilare File Singoli
Per compilare un singolo file, invece tutti i file contenuti in una directory, si utilizzi compile_file().
# compileall_compile_file.py
import compileall
import glob
def show(title):
print(title)
for filename in glob.glob('esempi/**',
recursive=True):
print(' {}'.format(filename))
print()
show('Prima')
compileall.compile_file('esempi/a.py')
show('\nDopo')
Il primo argomento dovrebbe essere il nome del file, rappresentato dal percorso completo oppure dal percorso relativo.
$ python3 compileall_compile_file.py Prima esempi/ esempi/README esempi/subdir esempi/subdir/b.py esempi/subdir/__pycache__ esempi/subdir/__pycache__/b.cpython-38.pyc esempi/__pycache__ esempi/__pycache__/a.cpython-36.pyc esempi/__pycache__/a.cpython-38.pyc esempi/a.py Dopo esempi/ esempi/README esempi/subdir esempi/subdir/b.py esempi/subdir/__pycache__ esempi/subdir/__pycache__/b.cpython-38.pyc esempi/__pycache__ esempi/__pycache__/a.cpython-36.pyc esempi/__pycache__/a.cpython-38.pyc esempi/a.py
Da Riga di Comando
E' anche possibile chiamare compileall da riga di comando, in modo che possa essere integrato con un sistema di compilazione tramite un Makefile. Ad esempio:
$ 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}
set .pyc invalidation mode; defaults to "checked-hash"
if the SOURCE_DATE_EPOCH environment variable is set,
and "timestamp" otherwise.
Per ricreare l'esempio precedente, ignorando la sottodirectory subdir, si esegue.
$ python3 -m compileall -x '/subdir' esempi Listing 'esempi'... Listing 'esempi/subdir'...
Vedere anche:
- compileall
- La documentazione della libreria standard per questo modulo.