Qu'est-ce que le format de fichier PYC ?
Les fichiers .pyc sont utilisés par le langage de programmation Python. Un fichier .pyc est un exécutable qui contient du bytecode compilé pour un programme écrit en source Python. Le bytecode est un ensemble d'instructions permettant à l'interpréteur d'exécuter le programme sans ré-analyser la source originale à chaque lancement, ce qui accélère le temps d'importation et de démarrage.
Les fichiers .pyc sont accompagnés de leurs fichiers sources .py associés. Python compile un fichier .py et enregistre le résultat dans un fichier .pyc, qui peut ensuite être utilisé pour exécuter le programme directement. Depuis Python 3.2, ces fichiers cache sont placés dans un sous-répertoire __pycache__ aux côtés de la source, avec la version de l'interpréteur intégrée dans le nom du fichier (par exemple, script.cpython-312.pyc).
Chaque fichier .pyc commence par un en-tête de 16 octets. Les deux premiers octets sont un « magic number » spécifique à la version - il change à chaque version de CPython - suivi de 0x0D 0x0A (CR LF) aux octets 2-3. Les octets restants de l'en-tête contiennent soit l'horodatage et la taille du fichier source (par défaut), soit un hachage du fichier source pour des builds déterministes et reproductibles, un schéma introduit par la PEP 552 dans Python 3.7. Après l'en-tête, le fichier contient un objet de code sérialisé (« marshalled ») qui peut être inspecté avec le module intégré dis de Python.
Le bytecode .pyc est lié à une version spécifique de CPython - un fichier compilé sous Python 3.11 ne se chargera pas sous Python 3.12. L'ancien format de bytecode optimisé .pyo a été supprimé dans Python 3.5 ; les builds optimisés produisent désormais des fichiers .opt-1.pyc ou .opt-2.pyc à la place. Pour décompiler un .pyc vers une source lisible, des outils tels que uncompyle6, decompyle3 et pycdc (Decompyle++) sont couramment utilisés, bien que la compatibilité varie selon la version de Python. Sur Windows, les modules d'extension compilés utilisent le format associé .pyd.
Sécurité et sûreté
RISQUE : MEDIUMUn .pyc est du bytecode que l'interpréteur Python EXÉCUTE, donc un .pyc malveillant peut exécuter du code arbitraire tout comme un script - n'exécutez jamais un .pyc provenant d'une source non fiable. C'est également une technique courante pour masquer des logiciels malveillants (en ne livrant que le bytecode compilé). À l'inverse, distribuer votre propre code sous forme de .pyc offre une protection très faible : il peut être décompilé et, au minimum, désassemblé avec le module « dis » fourni, ce n'est donc PAS un véritable moyen de garder la source secrète. La suppression des fichiers __pycache__ / .pyc est sans danger - Python les régénère automatiquement à partir des sources .py.
Détails du format
en brefProgrammes qui ouvrent les fichiers PYC
Détails techniques
spécifications approfondies| Développeur | Python Software Foundation (CPython) |
| Type MIME | application/x-python-code |
| Structure du fichier | Binaire - en-tête versionné de 16 octets suivi d'un objet de code Python sérialisé (marshalled) |
| Magic number | Octets 0-1 : valeur de 2 octets spécifique à la version (diffère selon la version de CPython) ; octets 2-3 : toujours 0x0D 0x0A (CR LF) |
| Disposition de l'en-tête | Magic 32 bits, drapeaux de champ de bits 32 bits, puis soit mtime 32 bits + taille source 32 bits (mode horodatage), soit un hachage source 32 bits (mode hachage PEP 552) |
| Répertoire de cache | Stocké dans __pycache__/ depuis Python 3.2 ; le nom du fichier encode la version de l'interpréteur, ex: script.cpython-312.pyc |
| Compatibilité de version | Chaque version de CPython écrit un magic number unique ; un .pyc de Python 3.11 ne se chargera pas sous 3.12 et vice versa |
| Portabilité de la plateforme | Indépendant de la plateforme au sein d'une même version de CPython - le même .pyc s'exécute sur Windows, macOS et Linux avec un interpréteur correspondant |
| Variantes optimisées | python -O et python -OO produisent .opt-1.pyc et .opt-2.pyc (suppression des asserts et docstrings) ; l'extension .pyo a été retirée dans Python 3.5 |
| Contrôle de l'auto-génération | CPython écrit les fichiers .pyc automatiquement lors de l'importation ; désactivé par le drapeau -B ou la variable d'environnement PYTHONDONTWRITEBYTECODE=1 |
| Désassemblage / décompilation | Le module intégré dis de Python désassemble le bytecode ; les outils tiers uncompyle6, decompyle3 et pycdc (Decompyle++) tentent une reconstruction de la source |
| Format de sérialisation interne | Les objets de code sont sérialisés avec le module marshal - un format binaire compact distinct de pickle, ne faisant pas partie de l'API publique stable |
| Builds basés sur le hachage | La PEP 552 (Python 3.7+) a introduit les fichiers .pyc basés sur le hachage : l'en-tête stocke un hachage du fichier source au lieu du mtime pour des builds reproductibles |
| Publié | Early CPython (1990s); current header layout (PEP 552 hash-based, deterministic) since Python 3.7, 2018 |
| Standard ouvert | Oui · libre de droits |
| Spécification | docs.python.org |
Conversions PYC
Q&R de la communauté
posées par les utilisateursPas encore de questions - soyez le premier à poser une question sur les fichiers PYC.