Wat is het PYO-bestandsformaat?
Een .pyo-bestand is een verouderd Python-geoptimaliseerd bytecode-bestand dat wordt geproduceerd door de CPython-interpreter wanneer deze wordt uitgevoerd met de -O (optimaliseren) of -OO vlag. Het doorgeven van -O verwijdert assert-statements uit de gecompileerde bytecode; het doorgeven van -OO verwijdert daarnaast alle docstrings, waardoor de bestandsgrootte iets afneemt.
Intern zijn .pyo-bestanden byte-voor-byte identiek qua formaat aan .pyc-bestanden: een 16-byte header (4-byte versiespecifiek magic number, 4-byte vlaggenveld, 4-byte tijdstempel of bron-hash, 4-byte brongrootte) gevolgd door een gemarshald CPython-codeobject. Het optimalisatieniveau wordt alleen weerspiegeld in de gecompileerde inhoud - nooit in de bestandsheader.
De .pyo-extensie is verouderd sinds Python 3.5 door PEP 488 (september 2015) en wordt niet langer gegenereerd door huidige Python-releases. Vanaf Python 3.5 en hoger wordt geoptimaliseerde bytecode opgeslagen in __pycache__ met namen als module.cpython-311.opt-1.pyc (voor -O) of .opt-2.pyc (voor -OO). Als u vandaag de dag een .pyo-bestand tegenkomt, is dit afkomstig van Python 2 of Python 3.0-3.4 code.
.pyo-bestanden zijn niet overdraagbaar tussen CPython-versies - het magic number verandert bij elke release. Tools zoals uncompyle6 (Python 2-3.8) en decompyle3 (Python 3.7-3.11) kunnen .pyo-bestanden decompileren naar een benadering van de .py-broncode, hoewel de nauwkeurigheid varieert per Python-versie en codecomplexiteit.
Beveiliging & veiligheid
RISICO: MEDIUMEen .pyo-bestand wordt uitgevoerd als Python-bytecode met alle mogelijkheden van een Python-script - bestandssysteemtoegang, netwerk, uitvoering van subprocessen. Voer nooit een .pyo uit van een niet-vertrouwde bron. Antivirussoftware scant vaak de inhoud van .pyo niet. Kwaadaardige Python-apps worden soms gedistribueerd als alleen-bytecode (.pyc/.pyo) om reverse engineering te bemoeilijken, hoewel decompileren de broncode grotendeels kan herstellen.
Formaatdetails
in een notendopProgramma's die PYO-bestanden openen
Technische details
diepe specificaties| Formaatrelatie | Byte-voor-byte identiek bestandsformaat aan `.pyc`; alleen onderscheiden door de bestandsextensie en optimalisatie-inhoud |
| Header-structuur | 16-byte header: 4-byte versie magic + 4-byte vlaggen + 4-byte bron mtime of hash + 4-byte brongrootte |
| Body-formaat | Gemarshald CPython-codeobject (bytecode-instructies, constantenpool, namen, varnamen, geneste codeobjecten) |
| Byte-volgorde | Little-endian (CPython marshal-serialisatieformaat) |
| Optimalisatieniveau -O | Verwijdert `assert`-statements uit gecompileerde bytecode |
| Optimalisatieniveau -OO | Verwijdert `assert`-statements en alle docstrings uit gecompileerde bytecode |
| Afschrijving | `.pyo`-extensie geëlimineerd in Python 3.5 (PEP 488, september 2015); wordt niet gegenereerd door huidige Python-releases |
| Modern equivalent | `module.cpython-3X.opt-1.pyc` (niveau 1) of `.opt-2.pyc` (niveau 2) opgeslagen in `__pycache__` |
| Versie-portabiliteit | Niet overdraagbaar tussen CPython-versies; het magic number in bytes 0-3 verandert bij elke grote CPython-release |
| Integriteitsvalidatie | Python 3.7+ (PEP 552): optionele SipHash van bron opgeslagen in header-vlaggen; Python 2 / vroege 3: alleen mtime-vergelijking |
| Decompilatie-tools | `uncompyle6` (Python 2-3.8), `decompyle3` (Python 3.7-3.11) |
| Legacy-bereik | Alleen geproduceerd door Python 2 of Python 3.0-3.4; komt niet voor in projecten die gericht zijn op Python 3.5 of later |
| Uitgebracht | Early CPython (1990s); same as .pyc but with optimizations (assert removal with -O; docstring removal with -OO) |
| Laatste versie | 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 |
| Open standaard | Ja · royaltyvrij |
| Specificatie | peps.python.org |
PYO conversies
Community V&A
gevraagd door gebruikersNog geen vragen - wees de eerste om iets te vragen over PYO-bestanden.