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

---

# 32.10. [`py_compile`](https://python-all.ru/3.4/library/py_compile.html#module-py_compile) – Компиляция исходных файлов Python

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

---

Модуль [`py_compile`](https://python-all.ru/3.4/library/py_compile.html#module-py_compile) предоставляет функцию для генерации байт-кодового файла из исходного файла, а также другую функцию, используемую при запуске исходного файла модуля как скрипта.

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

#### `exception py_compile.PyCompileError`

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

#### `py_compile.compile(file, cfile=None, dfile=None, doraise=False, optimize=-1)`

Компилирует исходный файл в байт-код и записывает кэш-файл байт-кода. Исходный код загружается из файла с именем *file*. Байт-код записывается в *cfile*, который по умолчанию соответствует пути [**PEP 3147**](https://python-all.ru/3.4/library/py_compile.html), оканчивающемуся на `.pyc` (`.pyo`, если в текущем интерпретаторе включена оптимизация). Например, если *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.4/library/py_compile.html#py_compile.PyCompileError). Если *doraise* равен false (по умолчанию), строка с ошибкой записывается в `sys.stderr`, но исключение не генерируется. Эта функция возвращает путь к скомпилированному файлу, т.е. то значение *cfile*, которое было использовано.

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

Параметр *optimize* управляет уровнем оптимизации и передается встроенной функции [`compile()`](https://python-all.ru/3.4/library/functions.html#compile). Значение по умолчанию `-1` выбирает уровень оптимизации текущего интерпретатора.

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

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

#### `py_compile.main(args=None)`

Компилирует несколько исходных файлов. Файлы, указанные в *args* (или в командной строке, если *args* равно `None`), компилируются, и результирующий байт-код кэшируется обычным образом. Эта функция не просматривает структуру каталогов для поиска исходных файлов; она компилирует только явно указанные файлы. Если `'-'` – единственный параметр в args, список файлов берется из стандартного ввода.

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

При запуске этого модуля как скрипта, функция [`main()`](https://python-all.ru/3.4/library/py_compile.html#py_compile.main) используется для компиляции всех файлов, перечисленных в командной строке. Код возврата будет ненулевым, если один из файлов не удалось скомпилировать.

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