Рубрики
Без рубрики

CompilealLL – исходные файлы байта-компиляции

Автор оригинала: 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'...

Смотрите также