compileall — Байт-компиляция библиотек Python

Исходный код: Lib/compileall.py.


Этот модуль предоставляет некоторые служебные функции для поддержки установки библиотек Python. Эти функции компилируют исходные файлы Python в дереве каталогов. Этот модуль можно использовать для создания кэшированных файлов байт-кода во время установки библиотеки, что делает их доступными для использования даже теми пользователями, у которых нет прав на запись в каталоги библиотеки.

Использование командной строки

Этот модуль может работать как сценарий (используя python -m compileall) для компиляции исходных текстов Python.

directory ...
file ...

Позиционными аргументами являются файлы для компиляции или каталоги, содержащие исходные файлы, которые обходятся рекурсивно. Если аргумент не указан, ведите себя так, как если бы командная строка была -l <directories from sys.path>.

-l

Не обращайтесь к подкаталогам, компилируйте только файлы исходного кода, непосредственно содержащиеся в именованных или подразумеваемых каталогах.

-f

Принудительная перестройка, даже если временные метки актуальны.

-q

Не печатать список скомпилированных файлов. Если передано один раз, сообщения об ошибках все равно будут выведены. Если передать дважды (-qq), весь вывод будет подавлен.

-d destdir

Каталог, добавляемый к пути к каждому компилируемому файлу. Он будет отображаться в трассировках времени компиляции, а также компилироваться в файл байт-кода, где будет использоваться в трассировках и других сообщениях в случаях, когда исходный файл не существует на момент выполнения файла байт-кода.

-s strip_prefix
-p prepend_prefix

Удаляет (-s) или добавляет (-p) заданный префикс путей, записанных в файлах .pyc. Не может комбинироваться с -d.

-x regex

regex используется для поиска полного пути к каждому файлу, рассматриваемому для компиляции, и если regex выдает совпадение, файл пропускается.

-i list

Прочитайте файл list и добавьте каждую содержащуюся в нем строку в список файлов и каталогов для компиляции. Если list является -, прочитайте строки из stdin.

-b

Записывать файлы байт-кода в их устаревшие местоположения и имена, которые могут перезаписывать файлы байт-кода, созданные другой версией Python. По умолчанию файлы записываются в их расположение и имена PEP 3147, что позволяет сосуществовать файлам байт-кода из нескольких версий Python.

-r

Управление максимальным уровнем рекурсии для подкаталогов. Если задан этот параметр, то опция -l не будет учитываться. python -m compileall <directory> -r 0 эквивалентен python -m compileall <directory> -l.

-j N

Используйте N рабочих для компиляции файлов в заданном каталоге. Если используется 0, то будет использован результат os.cpu_count().

--invalidation-mode [timestamp|checked-hash|unchecked-hash]

Управляет тем, как сгенерированные файлы байт-кода будут аннулированы во время выполнения. Значение timestamp означает, что будут генерироваться .pyc файлы с вложенной меткой времени и размером источника. Значения checked-hash и unchecked-hash приводят к генерации pycs на основе хэша. Пики на основе хэша содержат хэш содержимого исходного файла, а не временную метку. Смотрите Аннулирование кэшированного байткода для получения дополнительной информации о том, как Python проверяет файлы кэша байткода во время выполнения. По умолчанию используется значение timestamp, если переменная окружения SOURCE_DATE_EPOCH не установлена, и checked-hash, если переменная окружения SOURCE_DATE_EPOCH установлена.

-o level

Компиляция с заданным уровнем оптимизации. Может использоваться несколько раз для компиляции для нескольких уровней одновременно (например, compileall -o 1 -o 2).

-e dir

Игнорировать симлинки, указывающие за пределы заданного каталога.

Если два файла .pyc с разным уровнем оптимизации имеют одинаковое содержание, используйте жесткие ссылки для объединения дубликатов.

Изменено в версии 3.2: Добавлены опции -i, -b и -h.

Изменено в версии 3.5: Добавлены опции -j, -r и -qq. Опция -q была изменена на многоуровневое значение. -b всегда будет выдавать файл байт-кода, заканчивающийся на .pyc, никогда .pyo.

Изменено в версии 3.7: Добавлена опция --invalidation-mode.

Изменено в версии 3.9: Добавлены опции -s, -p, -e и --hardlink-dupes. Повышен предел рекурсии по умолчанию с 10 до sys.getrecursionlimit(). Добавлена возможность указать опцию -o несколько раз.

Опция командной строки для управления уровнем оптимизации, используемым функцией compile(), отсутствует, поскольку интерпретатор Python сам предоставляет такую возможность: python -O -m compileall.

Аналогично, функция compile() уважает настройку sys.pycache_prefix. Сгенерированный кэш байткода будет полезен, только если compile() будет запущен с тем же sys.pycache_prefix (если таковой имеется), который будет использоваться во время выполнения.

Общественные функции

compileall.compile_dir(dir, maxlevels=sys.getrecursionlimit(), ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=- 1, workers=1, invalidation_mode=None, *, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False)

Рекурсивно спуститься по дереву каталогов с именем dir, компилируя по пути все файлы .py. Возвращает значение true, если все файлы скомпилированы успешно, и false в противном случае.

Параметр maxlevels используется для ограничения глубины рекурсии; по умолчанию он равен sys.getrecursionlimit().

Если указан ddir, то он добавляется к пути к каждому компилируемому файлу для использования в трассировках времени компиляции, а также компилируется в файл байт-кода, где он будет использоваться в трассировках и других сообщениях в случаях, когда исходный файл не существует на момент выполнения файла байт-кода.

Если force равно true, модули перекомпилируются, даже если временные метки актуальны.

Если указан rx, его метод search вызывается на полном пути к каждому файлу, рассматриваемому для компиляции, и если он возвращает истинное значение, файл пропускается. Это можно использовать для исключения файлов, соответствующих регулярному выражению, заданному в виде объекта re.Pattern.

Если quiet имеет значение False или 0 (по умолчанию), имена файлов и другая информация выводятся в стандартный аут. Если установлено значение 1, печатаются только ошибки. При значении 2 весь вывод подавляется.

Если legacy равно true, файлы байт-кода записываются в их устаревшие местоположения и имена, которые могут перезаписывать файлы байт-кода, созданные другой версией Python. По умолчанию файлы записываются в их расположение и имена PEP 3147, что позволяет сосуществовать файлам байт-кода из нескольких версий Python.

optimize задает уровень оптимизации для компилятора. Он передается встроенной функции compile(). Принимает также последовательность уровней оптимизации, которая приводит к нескольким компиляциям одного файла .py за один вызов.

Аргумент workers указывает, сколько рабочих используется для параллельной компиляции файлов. По умолчанию не используется несколько рабочих. Если платформа не может использовать несколько рабочих и указан аргумент workers, то в качестве запасного варианта будет использоваться последовательная компиляция. Если workers равно 0, то используется количество ядер в системе. Если workers меньше, чем 0, будет выдано предупреждение ValueError.

invalidation_mode должен быть членом перечисления py_compile.PycInvalidationMode и управляет тем, как сгенерированные pycs будут аннулированы во время выполнения.

Аргументы stripdir, prependdir и limit_sl_dest соответствуют опциям -s, -p и -e, описанным выше. Они могут быть указаны как str, bytes или os.PathLike.

Если hardlink_dupes равно true и два файла .pyc с разным уровнем оптимизации имеют одинаковое содержимое, используйте жесткие ссылки для объединения дубликатов.

Изменено в версии 3.2: Добавлены параметры legacy и optimize.

Изменено в версии 3.5: Добавлен параметр работники.

Изменено в версии 3.5: Параметр quiet был изменен на многоуровневое значение.

Изменено в версии 3.5: Параметр legacy записывает только файлы .pyc, а не .pyo, независимо от значения параметра optimize.

Изменено в версии 3.6: Принимает path-like object.

Изменено в версии 3.7: Добавлен параметр invalidation_mode.

Изменено в версии 3.7.2: Значение по умолчанию параметра invalidation_mode обновлено на None.

Изменено в версии 3.8: Установка workers в 0 теперь выбирает оптимальное количество ядер.

Изменено в версии 3.9: Добавлены аргументы stripdir, prependdir, limit_sl_dest и hardlink_dupes. Значение по умолчанию maxlevels было изменено с 10 на sys.getrecursionlimit().

compileall.compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=- 1, invalidation_mode=None, *, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False)

Скомпилировать файл с путем fullname. Возвращает значение true в случае успешной компиляции файла и false в противном случае.

Если указан ddir, то он добавляется к пути к компилируемому файлу для использования в трассировках времени компиляции, а также компилируется в файл байт-кода, где он будет использоваться в трассировках и других сообщениях в случаях, когда исходный файл не существует на момент выполнения файла байт-кода.

Если указан rx, то его методу search передается полное имя пути к компилируемому файлу, и если он возвращает значение true, то файл не компилируется и возвращается True. Это можно использовать для исключения файлов, соответствующих регулярному выражению, заданному в виде объекта re.Pattern.

Если quiet имеет значение False или 0 (по умолчанию), имена файлов и другая информация выводятся в стандартный аут. Если установлено значение 1, печатаются только ошибки. При значении 2 весь вывод подавляется.

Если legacy равно true, файлы байт-кода записываются в их устаревшие местоположения и имена, которые могут перезаписывать файлы байт-кода, созданные другой версией Python. По умолчанию файлы записываются в их расположение и имена PEP 3147, что позволяет сосуществовать файлам байт-кода из нескольких версий Python.

optimize задает уровень оптимизации для компилятора. Он передается встроенной функции compile(). Принимает также последовательность уровней оптимизации, которая приводит к нескольким компиляциям одного файла .py за один вызов.

invalidation_mode должен быть членом перечисления py_compile.PycInvalidationMode и управляет тем, как сгенерированные pycs будут аннулированы во время выполнения.

Аргументы stripdir, prependdir и limit_sl_dest соответствуют опциям -s, -p и -e, описанным выше. Они могут быть указаны как str, bytes или os.PathLike.

Если hardlink_dupes равно true и два файла .pyc с разным уровнем оптимизации имеют одинаковое содержимое, используйте жесткие ссылки для объединения дубликатов.

Добавлено в версии 3.2.

Изменено в версии 3.5: Параметр quiet был изменен на многоуровневое значение.

Изменено в версии 3.5: Параметр legacy записывает только файлы .pyc, а не .pyo, независимо от значения параметра optimize.

Изменено в версии 3.7: Добавлен параметр invalidation_mode.

Изменено в версии 3.7.2: Значение по умолчанию параметра invalidation_mode обновлено на None.

Изменено в версии 3.9: Добавлены аргументы stripdir, prependdir, limit_sl_dest и hardlink_dupes.

compileall.compile_path(skip_curdir=True, maxlevels=0, force=False, quiet=0, legacy=False, optimize=- 1, invalidation_mode=None)

Байт-компиляция всех файлов .py, найденных вдоль sys.path. Возвращает значение true, если все файлы скомпилированы успешно, и false в противном случае.

Если skip_curdir равен true (по умолчанию), текущий каталог не включается в поиск. Все остальные параметры передаются в функцию compile_dir(). Обратите внимание, что в отличие от других функций компиляции, maxlevels по умолчанию имеет значение 0.

Изменено в версии 3.2: Добавлены параметры legacy и optimize.

Изменено в версии 3.5: Параметр quiet был изменен на многоуровневое значение.

Изменено в версии 3.5: Параметр legacy записывает только файлы .pyc, а не .pyo, независимо от значения параметра optimize.

Изменено в версии 3.7: Добавлен параметр invalidation_mode.

Изменено в версии 3.7.2: Значение по умолчанию параметра invalidation_mode обновлено на None.

Для принудительной перекомпиляции всех файлов .py в подкаталоге Lib/ и всех его подкаталогах:

import compileall

compileall.compile_dir('Lib/', force=True)

# Perform same compilation, excluding files in .svn directories.
import re
compileall.compile_dir('Lib/', rx=re.compile(r'[/\\][.]svn'), force=True)

# pathlib.Path objects can also be used.
import pathlib
compileall.compile_dir(pathlib.Path('Lib/'), force=True)

См.также

Модуль py_compile

Байт-компиляция одного исходного файла.

Вернуться на верх