Что такое формат файла PYO?
Файл .pyo - это устаревший оптимизированный байт-код Python, создаваемый интерпретатором CPython при запуске с флагом -O (оптимизация) или -OO. Передача -O удаляет инструкции assert из скомпилированного байт-кода; передача -OO дополнительно удаляет все строки документации (docstrings), немного уменьшая размер файла.
Внутренне файлы .pyo побайтово идентичны по формату файлам .pyc: 16-байтовый заголовок (4-байтовое магическое число версии, 4-байтовое поле флагов, 4-байтовая метка времени или хеш исходника, 4-байтовый размер исходника), за которым следует маршалированный объект кода CPython. Уровень оптимизации отражается только в скомпилированном содержимом - он никогда не указывается в заголовке файла.
Расширение .pyo было объявлено устаревшим в Python 3.5 согласно PEP 488 (сентябрь 2015 г.) и больше не генерируется ни одним современным выпуском Python. Начиная с Python 3.5, оптимизированный байт-код хранится внутри __pycache__ с именами вида module.cpython-311.opt-1.pyc (для -O) или .opt-2.pyc (для -OO). Если вы столкнулись с файлом .pyo сегодня, он происходит из кода Python 2 или Python 3.0-3.4.
Файлы .pyo не переносимы между версиями CPython - магическое число меняется с каждым выпуском. Такие инструменты, как uncompyle6 (Python 2-3.8) и decompyle3 (Python 3.7-3.11), могут декомпилировать файлы .pyo обратно в примерный исходный код .py, хотя точность варьируется в зависимости от версии Python и сложности кода.
Безопасность и защита
РИСК: MEDIUMФайл .pyo исполняется как байт-код Python со всеми возможностями скрипта Python - доступ к файловой системе, сеть, выполнение подпроцессов. Никогда не запускайте .pyo из ненадежных источников. Антивирусное ПО часто не сканирует содержимое .pyo. Вредоносные приложения Python иногда распространяются только в виде байт-кода (.pyc/.pyo), чтобы затруднить обратную разработку, хотя декомпиляторы могут в значительной степени восстановить исходный код.
Детали формата
в двух словахПрограммы, открывающие файлы PYO
Технические подробности
глубокая спецификация| Связь форматов | Побайтово идентичный формат файла с `.pyc`; отличается только расширением имени файла и содержимым оптимизации |
| Структура заголовка | 16-байтовый заголовок: 4 байта magic-числа версии + 4 байта флагов + 4 байта mtime или хеша исходника + 4 байта размера исходника |
| Формат тела | Маршалированный объект кода CPython (инструкции байт-кода, пул констант, имена, имена переменных, вложенные объекты кода) |
| Порядок байтов | Little-endian (формат сериализации marshal в CPython) |
| Уровень оптимизации -O | Удаляет инструкции `assert` из скомпилированного байт-кода |
| Уровень оптимизации -OO | Удаляет инструкции `assert` и все строки документации (docstrings) из скомпилированного байт-кода |
| Устаревание | Расширение `.pyo` упразднено в Python 3.5 (PEP 488, сентябрь 2015 г.); не генерируется современными версиями Python |
| Современный эквивалент | `module.cpython-3X.opt-1.pyc` (уровень 1) или `.opt-2.pyc` (уровень 2), хранящиеся в `__pycache__` |
| Переносимость версий | Не переносим между версиями CPython; магическое число в байтах 0-3 меняется с каждым мажорным выпуском CPython |
| Проверка целостности | Python 3.7+ (PEP 552): необязательный SipHash исходника, хранящийся во флагах заголовка; Python 2 / ранний 3: только сравнение mtime |
| Инструменты декомпиляции | `uncompyle6` (Python 2-3.8), `decompyle3` (Python 3.7-3.11) |
| Сфера применения (legacy) | Создавался только в Python 2 или Python 3.0-3.4; не встречается в проектах, ориентированных на Python 3.5 или новее |
| Выпущен | Early CPython (1990s); same as .pyc but with optimizations (assert removal with -O; docstring removal with -OO) |
| Последняя версия | DEPRECATED in Python 3.5 (PEP 488, September 2015) - .pyo extension no longer generated; replaced by .cpython-3X.opt-1.pyc / .opt-2.pyc naming |
| Открыть стандартное | Да · без роялти |
| Спецификация | peps.python.org |
Конвертации PYO
Вопросы и ответы сообщества
спрошено пользователямиВопросов пока нет - станьте первым, кто спросит о файлах PYO.