Qu'est-ce que le format de fichier PYO ?
Un fichier .pyo est un fichier de bytecode Python optimisé hérité produit par l'interpréteur CPython lorsqu'il est exécuté avec l'option -O (optimiser) ou -OO. L'utilisation de -O supprime les instructions assert du bytecode compilé ; l'utilisation de -OO supprime en plus toutes les chaînes de documentation (docstrings), réduisant ainsi légèrement la taille du fichier.
En interne, les fichiers .pyo ont un format identique octet par octet aux fichiers .pyc : un en-tête de 16 octets (nombre magique de 4 octets spécifique à la version, champ de drapeaux de 4 octets, horodatage ou hachage source de 4 octets, taille source de 4 octets) suivi d'un objet de code CPython sérialisé (marshalled). Le niveau d'optimisation n'est reflété que dans le contenu compilé - jamais dans l'en-tête du fichier.
L'extension .pyo a été obsolète dans Python 3.5 par la PEP 488 (septembre 2015) et n'est plus générée par aucune version actuelle de Python. À partir de Python 3.5, le bytecode optimisé est stocké dans __pycache__ avec des noms tels que module.cpython-311.opt-1.pyc (pour -O) ou .opt-2.pyc (pour -OO). Si vous rencontrez un fichier .pyo aujourd'hui, il provient de code Python 2 ou Python 3.0-3.4.
Les fichiers .pyo ne sont pas portables entre les versions de CPython - le nombre magique change à chaque version. Des outils tels que uncompyle6 (Python 2-3.8) et decompyle3 (Python 3.7-3.11) peuvent décompiler les fichiers .pyo pour retrouver un code source .py approximatif, bien que la précision varie selon la version de Python et la complexité du code.
Sécurité et sûreté
RISQUE : MEDIUMUn fichier .pyo s'exécute comme du bytecode Python avec toutes les capacités d'un script Python - accès au système de fichiers, réseau, exécution de sous-processus. N'exécutez jamais un .pyo provenant d'une source non fiable. Les logiciels antivirus ne scannent souvent pas le contenu des .pyo. Les applications Python malveillantes sont parfois distribuées uniquement sous forme de bytecode (.pyc/.pyo) pour rendre l'ingénierie inverse plus difficile, bien que les décompilateurs puissent largement récupérer la source.
Détails du format
en brefProgrammes qui ouvrent les fichiers PYO
Détails techniques
spécifications approfondies| Relation de format | Format de fichier identique octet par octet au `.pyc` ; distingué uniquement par l'extension du nom de fichier et le contenu d'optimisation |
| Structure de l'en-tête | En-tête de 16 octets : magic de version (4 octets) + drapeaux (4 octets) + mtime ou hachage source (4 octets) + taille source (4 octets) |
| Format du corps | Objet de code CPython sérialisé (instructions de bytecode, pool de constantes, noms, noms de variables, objets de code imbriqués) |
| Ordre des octets | Little-endian (format de sérialisation marshal de CPython) |
| Niveau d'optimisation -O | Supprime les instructions `assert` du bytecode compilé |
| Niveau d'optimisation -OO | Supprime les instructions `assert` et toutes les docstrings du bytecode compilé |
| Obsolescence | Extension `.pyo` éliminée dans Python 3.5 (PEP 488, septembre 2015) ; non générée par les versions actuelles de Python |
| Équivalent moderne | `module.cpython-3X.opt-1.pyc` (niveau 1) ou `.opt-2.pyc` (niveau 2) stocké dans `__pycache__` |
| Portabilité de version | Non portable entre les versions de CPython ; le nombre magique dans les octets 0-3 change à chaque version majeure de CPython |
| Validation d'intégrité | Python 3.7+ (PEP 552) : SipHash optionnel de la source stocké dans les drapeaux d'en-tête ; Python 2 / début 3 : comparaison mtime uniquement |
| Outils de décompilation | `uncompyle6` (Python 2-3.8), `decompyle3` (Python 3.7-3.11) |
| Portée historique | Produit uniquement par Python 2 ou Python 3.0-3.4 ; non rencontré dans les projets ciblant Python 3.5 ou ultérieur |
| Publié | Early CPython (1990s); same as .pyc but with optimizations (assert removal with -O; docstring removal with -OO) |
| Dernière version | 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 |
| Standard ouvert | Oui · libre de droits |
| Spécification | peps.python.org |
Conversions PYO
Q&R de la communauté
posées par les utilisateursPas encore de questions - soyez le premier à poser une question sur les fichiers PYO.