compileall — Байт-компиляция библиотек Python¶
Исходный код: Lib/compileall.py.
Этот модуль предоставляет некоторые служебные функции для поддержки установки библиотек Python. Эти функции компилируют исходные файлы Python в дереве каталогов. Этот модуль можно использовать для создания кэшированных файлов байт-кода во время установки библиотеки, что делает их доступными для использования даже теми пользователями, у которых нет прав на запись в каталоги библиотеки.
Использование командной строки¶
Этот модуль может работать как сценарий (используя python -m compileall) для компиляции исходных текстов Python.
-
directory...¶ -
file...¶ Позиционными аргументами являются файлы для компиляции или каталоги, содержащие исходные файлы, которые обходятся рекурсивно. Если аргумент не указан, ведите себя так, как если бы командная строка была
-l <directories from sys.path>.
-
-l¶ Не обращайтесь к подкаталогам, компилируйте только файлы исходного кода, непосредственно содержащиеся в именованных или подразумеваемых каталогах.
-
-f¶ Принудительная перестройка, даже если временные метки актуальны.
-
-q¶ Не печатать список скомпилированных файлов. Если передано один раз, сообщения об ошибках все равно будут выведены. Если передать дважды (
-qq), весь вывод будет подавлен.
-
-ddestdir¶ Каталог, добавляемый к пути к каждому компилируемому файлу. Он будет отображаться в трассировках времени компиляции, а также компилироваться в файл байт-кода, где будет использоваться в трассировках и других сообщениях в случаях, когда исходный файл не существует на момент выполнения файла байт-кода.
-
-sstrip_prefix¶
-
-pprepend_prefix¶ Удаляет (
-s) или добавляет (-p) заданный префикс путей, записанных в файлах.pyc. Не может комбинироваться с-d.
-
-xregex¶ regex используется для поиска полного пути к каждому файлу, рассматриваемому для компиляции, и если regex выдает совпадение, файл пропускается.
-
-ilist¶ Прочитайте файл
listи добавьте каждую содержащуюся в нем строку в список файлов и каталогов для компиляции. Еслиlistявляется-, прочитайте строки изstdin.
-
-b¶ Записывать файлы байт-кода в их устаревшие местоположения и имена, которые могут перезаписывать файлы байт-кода, созданные другой версией Python. По умолчанию файлы записываются в их расположение и имена PEP 3147, что позволяет сосуществовать файлам байт-кода из нескольких версий Python.
-
-r¶ Управление максимальным уровнем рекурсии для подкаталогов. Если задан этот параметр, то опция
-lне будет учитываться. python -m compileall <directory> -r 0 эквивалентен python -m compileall <directory> -l.
-
-jN¶ Используйте 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установлена.
-
-olevel¶ Компиляция с заданным уровнем оптимизации. Может использоваться несколько раз для компиляции для нескольких уровней одновременно (например,
compileall -o 1 -o 2).
-
-edir¶ Игнорировать симлинки, указывающие за пределы заданного каталога.
-
--hardlink-dupes¶ Если два файла
.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 Байт-компиляция одного исходного файла.