Hvad er PYO-filformatet?
En .pyo-fil er en legacy Python-optimeret bytecode-fil produceret af CPython-fortolkeren, når den køres med flaget -O (optimer) eller -OO. Ved at bruge -O fjernes assert-sætninger fra den kompilerede bytecode; ved brug af -OO fjernes desuden alle docstrings, hvilket reducerer filstørrelsen en smule.
Internt er .pyo-filer byte-for-byte identiske i format med .pyc-filer: en 16-byte header (4-byte versionsspecifikt magic number, 4-byte flag-felt, 4-byte tidsstempel eller kilde-hash, 4-byte kildestørrelse) efterfulgt af et marshalled CPython-kodeobjekt. Optimeringsniveauet afspejles kun i det kompilerede indhold - aldrig i filens header.
Filtypen .pyo blev udfaset i Python 3.5 af PEP 488 (september 2015) og genereres ikke længere af nogen nuværende Python-udgivelse. Fra Python 3.5 og frem gemmes optimeret bytecode i __pycache__ med navne som module.cpython-311.opt-1.pyc (for -O) eller .opt-2.pyc (for -OO). Hvis du støder på en .pyo-fil i dag, stammer den fra Python 2 eller Python 3.0-3.4-kode.
.pyo-filer er ikke portable på tværs af CPython-versioner - det magiske nummer ændres ved hver udgivelse. Værktøjer som uncompyle6 (Python 2-3.8) og decompyle3 (Python 3.7-3.11) kan dekompilere .pyo-filer tilbage til omtrentlig .py-kildekode, selvom nøjagtigheden varierer afhængigt af Python-version og kodens kompleksitet.
Sikkerhed og tryghed
RISIKO: MEDIUMEn .pyo-fil eksekveres som Python-bytecode med alle de samme rettigheder som et Python-script - adgang til filsystem, netværk og eksekvering af underprocesser. Kør aldrig en .pyo fra en upålidelig kilde. Antivirussoftware scanner ofte ikke .pyo-indhold. Skadelige Python-apps distribueres nogle gange kun som bytecode (.pyc/.pyo) for at gøre reverse engineering sværere, selvom dekompilatorer i vid udstrækning kan gendanne kildekoden.
Formatdetaljer
kort fortaltProgrammer der åbner PYO-filer
Tekniske detaljer
dyb specifikation| Formatforhold | Byte-for-byte identisk filformat med `.pyc`; adskilles kun af filtypenavnet og optimeringsindholdet |
| Header-struktur | 16-byte header: 4-byte versions-magic + 4-byte flag + 4-byte kilde-mtime eller hash + 4-byte kildestørrelse |
| Body-format | Marshalled CPython-kodeobjekt (bytecode-instruktioner, konstant-pool, navne, variabelnavne, indlejrede kodeobjekter) |
| Byte-rækkefølge | Little-endian (CPython marshal-serialiseringsformat) |
| Optimeringsniveau -O | Fjerner `assert`-sætninger fra kompileret bytecode |
| Optimeringsniveau -OO | Fjerner `assert`-sætninger og alle docstrings fra kompileret bytecode |
| Udfasning | Filtypen `.pyo` blev fjernet i Python 3.5 (PEP 488, september 2015); genereres ikke af nogen nuværende Python-udgivelse |
| Moderne ækvivalent | `module.cpython-3X.opt-1.pyc` (niveau 1) eller `.opt-2.pyc` (niveau 2) gemt i `__pycache__` |
| Versionsportabilitet | Ikke portabel på tværs af CPython-versioner; det magiske nummer i byte 0-3 ændres ved hver større CPython-udgivelse |
| Integritetsvalidering | Python 3.7+ (PEP 552): valgfri SipHash af kilde gemt i header-flag; Python 2 / tidlig 3: kun mtime-sammenligning |
| Dekompileringsværktøjer | `uncompyle6` (Python 2-3.8), `decompyle3` (Python 3.7-3.11) |
| Legacy-omfang | Produceret kun af Python 2 eller Python 3.0-3.4; findes ikke i projekter, der målretter Python 3.5 eller nyere |
| Udgivet | Early CPython (1990s); same as .pyc but with optimizations (assert removal with -O; docstring removal with -OO) |
| Seneste 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 |
| Åben standard | Ja · royaltyfri |
| Specifikation | peps.python.org |
PYO-konverteringer
Fællesskabets Q&A
spurgt af brugereIngen spørgsmål endnu - vær den første til at spørge om PYO-filer.