> **Источник:** https://python-all.ru/3.14/library/py_compile.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `py_compile` – Компиляция исходных файлов Python

**Исходный код:** [Lib/py\_compile.py](https://python-all.ru/src/3.14/Lib/py_compile.py)

---

Модуль `py_compile` содержит функцию для создания файла байт-кода из исходного файла и ещё одну функцию, которая вызывается при запуске модуля как скрипта.

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

#### `exception py_compile.PyCompileError`

Исключение, возникающее при попытке компиляции файла.

#### `py_compile.compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, invalidation_mode=PycInvalidationMode.TIMESTAMP, quiet=0)`

Компилирует исходный файл в байт-код и записывает файл кэша байт-кода. Исходный код загружается из файла с именем *file*. Байт-код записывается в *cfile*, который по умолчанию соответствует пути [**PEP 3147**](https://python-all.ru/3.14/library/py_compile.html)/[**PEP 488**](https://python-all.ru/3.14/library/py_compile.html), заканчивающемуся на `.pyc`. Например, если *file* – это `/foo/bar/baz.py`, то *cfile* по умолчанию будет `/foo/bar/__pycache__/baz.cpython-32.pyc` для Python 3.2. Если указан *dfile*, он используется вместо *file* в качестве имени исходного файла, из которого берутся строки для отображения в трассировках исключений. Если *doraise* равен true, при ошибке во время компиляции *file* вызывается [`PyCompileError`](https://python-all.ru/3.14/library/py_compile.html#py_compile.PyCompileError). Если *doraise* равен false (по умолчанию), строка с ошибкой записывается в `sys.stderr`, но исключение не вызывается. Функция возвращает путь к скомпилированному файлу, то есть то значение *cfile*, которое было использовано.

Аргументы *doraise* и *quiet* определяют, как обрабатываются ошибки при компиляции файла. Если *quiet* равен 0 или 1, а *doraise* равен false, применяется поведение по умолчанию: строка ошибки записывается в `sys.stderr`, и функция возвращает `None` вместо пути. Если *doraise* равен true, вместо этого вызывается [`PyCompileError`](https://python-all.ru/3.14/library/py_compile.html#py_compile.PyCompileError). Однако если *quiet* равен 2, сообщение не выводится, и *doraise* не действует.

Если путь, по которому становится *cfile* (явно указанный или вычисленный), является символической ссылкой или нерегулярным файлом, будет вызвано [`FileExistsError`](https://python-all.ru/3.14/library/exceptions.html#FileExistsError). Это служит предупреждением о том, что импорт преобразует такие пути в обычные файлы, если ему разрешено записывать в них скомпилированные файлы. Это побочный эффект использования импортом переименования файлов для размещения окончательного скомпилированного файла, чтобы предотвратить проблемы параллельной записи.

*optimize* управляет уровнем оптимизации и передаётся встроенной функции `compile()`. Значение по умолчанию `-1` выбирает уровень оптимизации текущего интерпретатора.

*invalidation\_mode* должен быть элементом перечисления [`PycInvalidationMode`](https://python-all.ru/3.14/library/py_compile.html#py_compile.PycInvalidationMode) и управляет тем, как созданный кэш байт-кода инвалидируется во время выполнения. Значение по умолчанию – [`PycInvalidationMode.CHECKED_HASH`](https://python-all.ru/3.14/library/py_compile.html#py_compile.PycInvalidationMode.CHECKED_HASH), если установлена переменная окружения `SOURCE_DATE_EPOCH`, в противном случае значение по умолчанию – [`PycInvalidationMode.TIMESTAMP`](https://python-all.ru/3.14/library/py_compile.html#py_compile.PycInvalidationMode.TIMESTAMP).

Изменено в версии 3.2: Значение по умолчанию *cfile* изменено на соответствующее [**PEP 3147**](https://python-all.ru/3.14/library/py_compile.html). Ранее по умолчанию было *file* + `'c'` (`'o'` если была включена оптимизация). Также добавлен параметр *optimize*.

Изменено в версии 3.4: Код изменён для использования [`importlib`](https://python-all.ru/3.14/library/importlib.html#module-importlib) при записи файла кэша байт-кода. Это означает, что семантика создания/записи файлов теперь соответствует тому, что делает `importlib`, например, права доступа, семантика записи с перемещением и т.д. Также добавлено предостережение, что [`FileExistsError`](https://python-all.ru/3.14/library/exceptions.html#FileExistsError) вызывается, если *cfile* является символической ссылкой или нерегулярным файлом.

Изменено в версии 3.7: Параметр *invalidation\_mode* был добавлен в соответствии с [**PEP 552**](https://python-all.ru/3.14/library/py_compile.html). Если установлена переменная окружения `SOURCE_DATE_EPOCH`, то *invalidation\_mode* будет принудительно установлен в [`PycInvalidationMode.CHECKED_HASH`](https://python-all.ru/3.14/library/py_compile.html#py_compile.PycInvalidationMode.CHECKED_HASH).

Изменено в версии 3.7.2: Переменная окружения `SOURCE_DATE_EPOCH` больше не переопределяет значение аргумента *invalidation\_mode*, а вместо этого определяет его значение по умолчанию.

Изменено в версии 3.8: Добавлен параметр *quiet*.

#### `class py_compile.PycInvalidationMode`

Перечисление возможных методов, которые интерпретатор может использовать для определения, соответствует ли файл байт-кода исходному файлу. Файл `.pyc` указывает желаемый режим инвалидации в своём заголовке. См. [Инвалидация кэшированного байт-кода](https://python-all.ru/3.14/reference/import.html#pyc-invalidation) для получения дополнительной информации о том, как Python инвалидирует файлы `.pyc` во время выполнения.

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

#### `TIMESTAMP`

Файл `.pyc` содержит временную метку и размер исходного файла; Python сравнивает их с метаданными исходного файла во время выполнения, чтобы определить, нужно ли пересоздать файл `.pyc`.

#### `CHECKED_HASH`

Файл `.pyc` содержит хеш содержимого исходного файла; Python сравнивает его с исходным файлом во время выполнения, чтобы определить, нужно ли пересоздать файл `.pyc`.

#### `UNCHECKED_HASH`

Как и [`CHECKED_HASH`](https://python-all.ru/3.14/library/py_compile.html#py_compile.PycInvalidationMode.CHECKED_HASH), файл `.pyc` содержит хеш содержимого исходного файла. Однако Python во время выполнения будет считать файл `.pyc` актуальным и вообще не будет проверять `.pyc` на соответствие исходному файлу.

Этот параметр полезен, когда `.pycs` поддерживаются в актуальном состоянии какой-либо внешней по отношению к Python системой, например, системой сборки.

## Интерфейс командной строки

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

#### `<file> ... <fileN>`

#### `-`

Позиционные аргументы – это файлы для компиляции. Если `-` является единственным параметром, список файлов берётся из стандартного ввода.

#### `-q, --quiet`

Подавляет вывод ошибок.

Изменено в версии 3.2: добавлена поддержка `-`.

Изменено в версии 3.10: добавлена поддержка [`-q`](https://python-all.ru/3.14/library/py_compile.html#cmdoption-python-m-py_compile-q).

> **См. также**
>
> **Модуль [`compileall`](https://python-all.ru/3.14/library/compileall.html#module-compileall)**
>
> Утилиты для компиляции всех исходных файлов Python в дереве каталогов.
