Hva er PYO-filformatet?
En .pyo-fil er en utdatert Python-optimalisert bytekode-fil produsert av CPython-tolkeren når den kjøres med flagget -O (optimaliser) eller -OO. Ved å bruke -O fjernes assert-setninger fra den kompilerte bytekoden; ved bruk av -OO fjernes i tillegg alle docstrings, noe som reduserer filstørrelsen noe.
Internt er .pyo-filer identiske i format, byte-for-byte, med .pyc-filer: en 16-byte header (4-byte versjonsspesifikt «magic number», 4-byte flaggfelt, 4-byte tidsstempel eller kilde-hash, 4-byte kildestørrelse) etterfulgt av et marshalled CPython-kodeobjekt. Optimaliseringsnivået gjenspeiles kun i det kompilerte innholdet - aldri i filens header.
Filendelsen .pyo ble avviklet i Python 3.5 gjennom PEP 488 (september 2015) og genereres ikke lenger av noen nåværende Python-utgivelser. Fra Python 3.5 og utover lagres optimalisert bytekode i __pycache__ med navn som module.cpython-311.opt-1.pyc (for -O) eller .opt-2.pyc (for -OO). Hvis du støter på en .pyo-fil i dag, stammer den fra Python 2 eller Python 3.0-3.4-kode.
.pyo-filer er ikke portable på tvers av CPython-versjoner - «magic number» endres med hver utgivelse. Verktøy som uncompyle6 (Python 2-3.8) og decompyle3 (Python 3.7-3.11) kan dekompilere .pyo-filer tilbake til tilnærmet .py-kildekode, selv om nøyaktigheten varierer etter Python-versjon og kodens kompleksitet.
Sikkerhet og trygghet
RISIKO: MEDIUMEn .pyo-fil kjøres som Python-bytekode med alle rettighetene til et Python-skript - tilgang til filsystem, nettverk og kjøring av underprosesser. Kjør aldri en .pyo fra en upålitelig kilde. Antivirusprogramvare skanner ofte ikke innholdet i .pyo-filer. Skadelige Python-apper distribueres noen ganger kun som bytekode (.pyc/.pyo) for å gjøre omvendt utvikling vanskeligere, selv om dekompilatorer i stor grad kan gjenopprette kildekoden.
Formatdetaljer
i et nøtteskallProgrammer som åpner PYO-filer
Tekniske detaljer
dyp spesifikasjon| Formatforhold | Identisk filformat byte-for-byte med `.pyc`; skiller seg kun ved filendelsen og optimalisert innhold |
| Header-struktur | 16-byte header: 4-byte versjons-magic + 4-byte flagg + 4-byte kilde-mtime eller hash + 4-byte kildestørrelse |
| Innholdsformat | Marshalled CPython-kodeobjekt (bytekode-instruksjoner, konstant-pool, navn, variabelnavn, nøstede kodeobjekter) |
| Byterekkefølge | Little-endian (CPython marshal-serialiseringsformat) |
| Optimaliseringsnivå -O | Fjerner `assert`-setninger fra kompilert bytekode |
| Optimaliseringsnivå -OO | Fjerner `assert`-setninger og alle docstrings fra kompilert bytekode |
| Avvikling | Filendelsen `.pyo` ble fjernet i Python 3.5 (PEP 488, september 2015); genereres ikke av noen nåværende Python-utgivelse |
| Moderne ekvivalent | `module.cpython-3X.opt-1.pyc` (nivå 1) eller `.opt-2.pyc` (nivå 2) lagret i `__pycache__` |
| Versjonsportabilitet | Ikke portabel på tvers av CPython-versjoner; «magic number» i byte 0-3 endres med hver store CPython-utgivelse |
| Integritetsvalidering | Python 3.7+ (PEP 552): valgfri SipHash av kilde lagret i header-flagg; Python 2 / tidlig 3: kun mtime-sammenligning |
| Dekompileringsverktøy | `uncompyle6` (Python 2-3.8), `decompyle3` (Python 3.7-3.11) |
| Historisk omfang | Produsert kun av Python 2 eller Python 3.0-3.4; forekommer ikke i prosjekter som bruker Python 3.5 eller nyere |
| Utgitt | Early CPython (1990s); same as .pyc but with optimizations (assert removal with -O; docstring removal with -OO) |
| Siste versjon | 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 |
| Åpen standard | Ja · royalty-fri |
| Spesifikasjon | peps.python.org |
PYO-konverteringer
Spørsmål og svar fra fellesskapet
spurt av brukereIngen spørsmål ennå - vær den første til å spørre om PYO-filer.