Что такое формат файла PYC?
Файлы .pyc используются языком программирования Python. Файл .pyc представляет собой исполняемый файл, содержащий скомпилированный байт-код для программы, написанной на исходном коде Python. Байт-код - это набор инструкций для интерпретатора, позволяющий запускать программу без повторного синтаксического анализа исходного кода при каждом запуске, что ускоряет время импорта и запуска.
Файлы .pyc сопровождаются соответствующими исходными файлами .py. Python компилирует файл .py и сохраняет результат в файле .pyc, который затем можно использовать для прямого запуска программы. Начиная с Python 3.2, эти файлы кэша помещаются в подкаталог __pycache__ рядом с исходным кодом, а версия интерпретатора встраивается в имя файла (например, script.cpython-312.pyc).
Каждый файл .pyc начинается с 16-байтового заголовка. Первые два байта - это специфический для версии «магический номер» (magic number), который меняется с каждым выпуском CPython, за которым следуют 0x0D 0x0A (CR LF) в байтах 2-3. Остальные байты заголовка содержат либо метку времени и размер исходного файла (по умолчанию), либо хеш исходного файла для детерминированных, воспроизводимых сборок - схема, представленная в PEP 552 в Python 3.7. После заголовка файл содержит маршалированный объект кода, который можно просмотреть с помощью встроенного модуля Python dis.
Байт-код .pyc привязан к конкретной версии CPython - файл, скомпилированный в Python 3.11, не загрузится в Python 3.12. Старый формат оптимизированного байт-кода .pyo был удален в Python 3.5; теперь оптимизированные сборки создают файлы .opt-1.pyc или .opt-2.pyc. Для декомпиляции .pyc обратно в читаемый исходный код обычно используются такие инструменты, как uncompyle6, decompyle3 и pycdc (Decompyle++), хотя совместимость зависит от версии Python. В Windows скомпилированные модули расширения используют родственный формат .pyd.
Безопасность и защита
РИСК: MEDIUMФайл .pyc - это байт-код, который интерпретатор Python ВЫПОЛНЯЕТ, поэтому вредоносный .pyc может запускать произвольный код так же, как и скрипт - никогда не запускайте .pyc из ненадежных источников. Это также распространенный метод сокрытия вредоносного ПО (поставка только скомпилированного байт-кода). И наоборот, распространение собственного кода в виде .pyc дает очень слабую защиту: его можно декомпилировать и, как минимум, дизассемблировать с помощью встроенного модуля «dis», так что это НЕ настоящий способ сохранить исходный код в секрете. Удаление файлов __pycache__ / .pyc безопасно - Python автоматически регенерирует их из исходников .py.
Детали формата
в двух словахПрограммы, открывающие файлы PYC
Технические подробности
глубокая спецификация| Разработчик | Python Software Foundation (CPython) |
| MIME-тип | application/x-python-code |
| Структура файла | Бинарная - 16-байтовый заголовок с версией, за которым следует маршалированный объект кода Python |
| Магическое число | Байты 0-1: 2-байтовое значение, зависящее от версии (различается для каждого релиза CPython); байты 2-3: всегда 0x0D 0x0A (CR LF) |
| Макет заголовка | 32-битное магическое число, 32-битные флаги битовых полей, затем либо 32-битное mtime + 32-битный размер исходника (режим метки времени), либо 32-битный хеш исходника (режим хеша PEP 552) |
| Каталог кэша | Хранится в __pycache__/ начиная с Python 3.2; имя файла кодирует версию интерпретатора, например script.cpython-312.pyc |
| Совместимость версий | Каждая версия CPython записывает уникальный магический номер; .pyc от Python 3.11 не загрузится в 3.12 и наоборот |
| Портативность платформы | Платформонезависим в рамках одной и той же версии CPython - один и тот же .pyc работает на Windows, macOS и Linux с подходящим интерпретатором |
| Оптимизированные варианты | Команды «python -O» и «python -OO» создают .opt-1.pyc и .opt-2.pyc (удаляют утверждения assert и строки документации); расширение .pyo было упразднено в Python 3.5 |
| Управление автогенерацией | CPython записывает файлы .pyc автоматически при импорте; подавляется флагом -B или переменной окружения PYTHONDONTWRITEBYTECODE=1 |
| Дизассемблирование / декомпиляция | Встроенный модуль Python «dis» дизассемблирует байт-код; сторонние инструменты uncompyle6, decompyle3 и pycdc (Decompyle++) пытаются восстановить исходный код |
| Внутренний формат сериализации | Объекты кода сериализуются с помощью модуля marshal - компактного бинарного формата, отличного от pickle и не являющегося частью стабильного публичного API |
| Сборки на основе хеша | В PEP 552 (Python 3.7+) представлены файлы .pyc на основе хеша: заголовок хранит хеш исходного файла вместо mtime для воспроизводимых сборок |
| Выпущен | Early CPython (1990s); current header layout (PEP 552 hash-based, deterministic) since Python 3.7, 2018 |
| Открыть стандартное | Да · без роялти |
| Спецификация | docs.python.org |
Конвертации PYC
Вопросы и ответы сообщества
спрошено пользователямиВопросов пока нет - станьте первым, кто спросит о файлах PYC.