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 -
Используется регулярное выражение для поиска полного пути к каждому файлу, рассматриваемому для компиляции. Если регулярное выражение находит совпадение, файл пропускается.
-
-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приводят к генерации pyc-файлов на основе хэша. Pyc-файлы на основе хэша содержат хэш содержимого исходного файла, а не метку времени. Смотрите Аннулирование кэшированного байт-кода для получения более подробной информации о том, как Python проверяет файлы кеша байт-кода во время выполнения. По умолчанию используетсяtimestampесли переменная средыSOURCE_DATE_EPOCHне задана, иchecked-hashесли переменная средыSOURCE_DATE_EPOCHзадана.
-
-o level -
Компиляция с заданным уровнем оптимизации. Может быть указано несколько раз для компиляции сразу по нескольким уровням (например,
compileall -o 1 -o 2).
-
-e dir -
Игнорировать символьные ссылки, указывающие за пределы заданного каталога.
-
--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файлы по пути. Возвращает истинное значение, если все файлы были успешно скомпилированы, и ложное значение в противном случае.Параметр 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и управляет тем, как сгенерированные pyc файлы аннулируются во время выполнения.Аргументы stripdir, prependdir и limit_sl_dest соответствуют параметрам
-s,-pи-eописанным выше. Они могут быть заданы какstr,bytesилиos.PathLike.Если hardlink_dupes имеет значение true и два
.pycфайла с различными уровнями оптимизации имеют одинаковое содержимое, используются жёсткие ссылки для объединения дублирующихся файлов.Изменено в версии 3.2: Добавлен параметр legacy и optimize.
Изменено в версии 3.5: Добавлен параметр workers.
Изменено в версии 3.5: Параметр quiet был изменён на многоуровневый.
Изменено в версии 3.5: Параметр legacy записывает только файлы
.pyc, а не файлы.pyo, независимо от значения optimize.Изменено в версии 3.6: Принимает объект-путь.
Изменено в версии 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. Возвращает истинное значение, если файл был успешно скомпилирован, и ложное значение в противном случае.
Если задан параметр 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и управляет тем, как сгенерированные pyc файлы аннулируются во время выполнения.Аргументы 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. Возвращает истинное значение, если все файлы были успешно скомпилированы, и ложное значение в противном случае.Если 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)
См. также
-
Modulepy_compile -
Компиляция одного исходного файла.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/compileall.html