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
¶ Игнорировать симлинки, указывающие за пределы заданного каталога.
-
--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
Байт-компиляция одного исходного файла.