Автор оригинала: Doug Hellmann.
Цель:
Конвертировать исходные файлы в байтовую версию.
Модуль COMPILELLL
находит исходные файлы Python и компилирует их в представление кода байта, сохраняя результаты в . Pycc
.
Компиляция одного каталога
COMPILE_DIR ()
используется для рекурсивно сканирования каталога и байта – компилируйте файлы в нем.
compileall_compile_dir.py
import compileall import glob def show(title): print(title) for filename in glob.glob('examples/**', recursiveTrue): print(' {}'.format(filename)) print() show('Before') compileall.compile_dir('examples') show('\nAfter')
По умолчанию все подкаталоги отсканированы на глубину 10. Выходные файлы записываются на <код> __ Pycache __ Directory и названы на основе версии интерпретатора Python.
$ 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
Игнорирование файлов
Для фильтрации каталогов используйте аргумент <код> RX , чтобы обеспечить регулярное выражение, чтобы соответствовать именам исключить.
compileall_exclude_dirs.py
import compileall import re compileall.compile_dir( 'examples', rxre.compile(r'/subdir'), )
Эта версия исключает файлы в подкаталоге Code> Subdir.
$ python3 compileall_exclude_dirs.py Listing 'examples'... Compiling 'examples/a.py'... Listing 'examples/subdir'...
<Код> Maxlevels аргумент контролирует глубину рекурсии. Например, чтобы избежать рекурсии, полностью пройти <код> 0 .
compileall_recursion_depth.py
import compileall import re compileall.compile_dir( 'examples', maxlevels0, )
Только файлы внутри каталога, передаваемые в COMPILE_DIR () .
$ python3 compileall_recursion_depth.py Listing 'examples'... Compiling 'examples/a.py'...
Компиляция Sys.Path.
Все исходные файлы Python, найденные в Sys.Path, могут быть скомпилированы одним вызовом для Compile_Path ()
.
compileall_path.py
import compileall import sys sys.path[:] ['examples', 'notthere'] print('sys.path =', sys.path) compileall.compile_path()
Этот пример заменяет содержимое по умолчанию SYSSPATH
, чтобы избежать ошибок разрешений при запуске скрипта, но все еще иллюстрирует поведение по умолчанию. Обратите внимание, что <код> maxlevels значение по умолчанию для <код> 0 .
$ python3 compileall_path.py sys.path = ['examples', 'notthere'] Listing 'examples'... Compiling 'examples/a.py'... Listing 'notthere'... Can't list 'notthere'
Компиляция отдельных файлов
Чтобы скомпилировать один файл, а не весь каталог файлов, используйте COMPILE_FILE ()
.
compileall_compile_file.py
import compileall import glob def show(title): print(title) for filename in glob.glob('examples/**', recursiveTrue): print(' {}'.format(filename)) print() show('Before') compileall.compile_file('examples/a.py') show('\nAfter')
Первый аргумент должен быть именем файла, либо полный путь или относительный путь.
$ 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
Из командной строки
Также можно вызвать <код> CompilealLL из командной строки, поэтому ее можно интегрировать с помощью системы сборки через Makefile. Например:
$ 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
Чтобы воссоздать более ранний пример, пропуская <код> Directory , запустите:
$ python3 -m compileall -x '/subdir' examples Listing 'examples'... Compiling 'examples/a.py'... Listing 'examples/subdir'...
Смотрите также