¿Qué es el formato de archivo PYO?
Un archivo .pyo es un archivo de bytecode optimizado de Python legado producido por el intérprete CPython cuando se ejecuta con el modificador -O (optimizar) o -OO. Al pasar -O se eliminan las sentencias assert del bytecode compilado; al pasar -OO se eliminan además todas las cadenas de documentación (docstrings), reduciendo ligeramente el tamaño del archivo.
Internamente, los archivos .pyo tienen un formato idéntico byte por byte a los archivos .pyc: un encabezado de 16 bytes (número mágico de 4 bytes específico de la versión, campo de banderas de 4 bytes, marca de tiempo o hash de origen de 4 bytes, tamaño de origen de 4 bytes) seguido de un objeto de código CPython serializado (marshalled). El nivel de optimización se refleja únicamente en el contenido compilado, nunca en el encabezado del archivo.
La extensión .pyo fue declarada obsoleta en Python 3.5 por el PEP 488 (septiembre de 2015) y ya no es generada por ninguna versión actual de Python. A partir de Python 3.5, el bytecode optimizado se almacena dentro de __pycache__ con nombres como module.cpython-311.opt-1.pyc (para -O) o .opt-2.pyc (para -OO). Si encuentra un archivo .pyo hoy en día, se origina a partir de código de Python 2 o Python 3.0-3.4.
Los archivos .pyo no son portables entre versiones de CPython; el número mágico cambia con cada lanzamiento. Herramientas como uncompyle6 (Python 2-3.8) y decompyle3 (Python 3.7-3.11) pueden descompilar archivos .pyo de nuevo a un código fuente .py aproximado, aunque la precisión varía según la versión de Python y la complejidad del código.
Seguridad y protección
RIESGO: MEDIUMUn archivo .pyo se ejecuta como bytecode de Python con todas las capacidades de un script de Python: acceso al sistema de archivos, red, ejecución de subprocesos. Nunca ejecute un .pyo de una fuente no confiable. El software antivirus a menudo no escanea el contenido de los .pyo. Las aplicaciones maliciosas de Python a veces se distribuyen solo como bytecode (.pyc/.pyo) para dificultar la ingeniería inversa, aunque los descompiladores pueden recuperar gran parte del código fuente.
Detalles del formato
en pocas palabrasProgramas que abren archivos PYO
Detalles técnicos
especificación profunda| Relación de formato | Formato de archivo idéntico byte por byte a `.pyc`; se distingue solo por la extensión del nombre de archivo y el contenido de optimización |
| Estructura del encabezado | Encabezado de 16 bytes: 4 bytes de magia de versión + 4 bytes de banderas + 4 bytes de mtime o hash de origen + 4 bytes de tamaño de origen |
| Formato del cuerpo | Objeto de código CPython serializado (instrucciones de bytecode, grupo de constantes, nombres, nombres de variables, objetos de código anidados) |
| Orden de bytes | Little-endian (formato de serialización marshal de CPython) |
| Nivel de optimización -O | Elimina las sentencias `assert` del bytecode compilado |
| Nivel de optimización -OO | Elimina las sentencias `assert` y todas las cadenas de documentación (docstrings) del bytecode compilado |
| Obsolescencia | La extensión `.pyo` fue eliminada en Python 3.5 (PEP 488, septiembre de 2015); no es generada por ninguna versión actual de Python |
| Equivalente moderno | `module.cpython-3X.opt-1.pyc` (nivel 1) o `.opt-2.pyc` (nivel 2) almacenado en `__pycache__` |
| Portabilidad de versión | No es portable entre versiones de CPython; el número mágico en los bytes 0-3 cambia con cada lanzamiento principal de CPython |
| Validación de integridad | Python 3.7+ (PEP 552): SipHash opcional de la fuente almacenado en las banderas del encabezado; Python 2 / inicios de 3: solo comparación de mtime |
| Herramientas de descompilación | `uncompyle6` (Python 2-3.8), `decompyle3` (Python 3.7-3.11) |
| Alcance legado | Producido solo por Python 2 o Python 3.0-3.4; no se encuentra en proyectos que apuntan a Python 3.5 o posterior |
| Lanzado | Early CPython (1990s); same as .pyc but with optimizations (assert removal with -O; docstring removal with -OO) |
| Última versión | 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 |
| Estándar abierto | Sí · libre de regalías |
| Especificación | peps.python.org |
Conversiones de PYO
Preguntas y respuestas de la comunidad
preguntado por usuariosAún no hay preguntas; sea el primero en preguntar sobre los archivos PYO.