¿Qué es el formato de archivo PYC?
Los archivos .pyc son utilizados por el lenguaje de programación Python. Un archivo .pyc es un ejecutable que contiene bytecode compilado para un programa escrito en fuente de Python. El bytecode es un conjunto de instrucciones para que el intérprete ejecute el programa sin volver a analizar el código fuente original en cada lanzamiento, lo que acelera el tiempo de importación e inicio.
Los archivos .pyc van acompañados de sus archivos fuente .py relacionados. Python compila un archivo .py y guarda el resultado en un archivo .pyc, que luego puede usarse para ejecutar el programa directamente. Desde Python 3.2, estos archivos de caché se colocan en un subdirectorio __pycache__ junto al código fuente, con la versión del intérprete incrustada en el nombre del archivo (por ejemplo, script.cpython-312.pyc).
Cada archivo .pyc comienza con un encabezado de 16 bytes. Los dos primeros bytes son un número mágico específico de la versión (cambia con cada lanzamiento de CPython), seguidos de 0x0D 0x0A (CR LF) en los bytes 2-3. Los bytes restantes del encabezado contienen una marca de tiempo y el tamaño del archivo fuente (por defecto) o un hash del archivo fuente para compilaciones deterministas y reproducibles, un esquema introducido por PEP 552 en Python 3.7. Después del encabezado, el archivo contiene un objeto de código serializado (marshalled) que puede inspeccionarse con el módulo integrado dis de Python.
El bytecode .pyc está vinculado a una versión específica de CPython: un archivo compilado bajo Python 3.11 no se cargará bajo Python 3.12. El antiguo formato de bytecode optimizado .pyo se eliminó en Python 3.5; las compilaciones optimizadas ahora producen archivos .opt-1.pyc o .opt-2.pyc en su lugar. Para descompilar un .pyc de nuevo a código fuente legible, se suelen utilizar herramientas como uncompyle6, decompyle3 y pycdc (Decompyle++), aunque la compatibilidad varía según la versión de Python. En Windows, los módulos de extensión compilados utilizan el formato relacionado .pyd.
Seguridad y protección
RIESGO: MEDIUMUn .pyc es bytecode que el intérprete de Python EJECUTA, por lo que un .pyc malicioso puede ejecutar código arbitrario al igual que un script; nunca ejecute un .pyc de una fuente no confiable. También es una técnica común para ocultar malware (enviando solo el bytecode compilado). Por el contrario, distribuir su propio código como .pyc ofrece una protección muy débil: se puede descompilar y, como mínimo, desensamblar con el módulo «dis» incluido, por lo que NO es una forma real de mantener el código fuente en secreto. Eliminar los archivos __pycache__ / .pyc es seguro: Python los regenera automáticamente a partir de los fuentes .py.
Detalles del formato
en pocas palabrasProgramas que abren archivos PYC
Detalles técnicos
especificación profunda| Desarrollador | Python Software Foundation (CPython) |
| Tipo MIME | application/x-python-code |
| Estructura del archivo | Binario - encabezado con versión de 16 bytes seguido de un objeto de código Python serializado |
| Número mágico | Bytes 0-1: valor de 2 bytes específico de la versión (difiere según el lanzamiento de CPython); bytes 2-3: siempre 0x0D 0x0A (CR LF) |
| Diseño del encabezado | Magic de 32 bits, banderas de campo de bits de 32 bits, luego mtime de 32 bits + tamaño de fuente de 32 bits (modo timestamp) o un hash de fuente de 32 bits (modo hash PEP 552) |
| Directorio de caché | Almacenado en __pycache__/ desde Python 3.2; el nombre del archivo codifica la versión del intérprete, p. ej. script.cpython-312.pyc |
| Compatibilidad de versiones | Cada versión de CPython escribe un número mágico único; un .pyc de Python 3.11 no se cargará en 3.12 y viceversa |
| Portabilidad de plataforma | Independiente de la plataforma dentro de la misma versión de CPython: el mismo .pyc se ejecuta en Windows, macOS y Linux con un intérprete coincidente |
| Variantes optimizadas | python -O y python -OO producen .opt-1.pyc y .opt-2.pyc (eliminan aserciones y docstrings); la extensión .pyo se retiró en Python 3.5 |
| Control de autogeneración | CPython escribe archivos .pyc automáticamente al importar; se suprime con la bandera -B o la variable de entorno PYTHONDONTWRITEBYTECODE=1 |
| Desensamblado / descompilación | El módulo integrado dis de Python desensambla el bytecode; las herramientas de terceros uncompyle6, decompyle3 y pycdc (Decompyle++) intentan la reconstrucción del código fuente |
| Formato de serialización interna | Los objetos de código se serializan con el módulo marshal, un formato binario compacto distinto de pickle, que no forma parte de la API pública estable |
| Compilaciones basadas en hash | PEP 552 (Python 3.7+) introdujo archivos .pyc basados en hash: el encabezado almacena un hash del archivo fuente en lugar de mtime para compilaciones reproducibles |
| Lanzado | Early CPython (1990s); current header layout (PEP 552 hash-based, deterministic) since Python 3.7, 2018 |
| Estándar abierto | Sí · libre de regalías |
| Especificación | docs.python.org |
Conversiones de PYC
Preguntas y respuestas de la comunidad
preguntado por usuariosAún no hay preguntas; sea el primero en preguntar sobre los archivos PYC.