Vad är filformatet PYO?
En .pyo-fil är en föråldrad Python-optimerad bytekodfil som skapas av CPython-tolken när den körs med flaggan -O (optimera) eller -OO. Om man använder -O tas assert-satser bort från den kompilerade bytekoden; med -OO tas dessutom alla docstrings bort, vilket minskar filstorleken något.
Internt är .pyo-filer identiska i formatet byte-för-byte med .pyc-filer: en 16-byte header (4-byte versionsspecifikt magiskt nummer, 4-byte flaggfält, 4-byte tidsstämpel eller källhash, 4-byte källstorlek) följt av ett serialiserat (marshalled) CPython-kodobjekt. Optimeringsnivån återspeglas endast i det kompilerade innehållet - aldrig i filens header.
Filändelsen .pyo fasades ut i Python 3.5 genom PEP 488 (september 2015) och genereras inte längre av någon aktuell Python-version. Från Python 3.5 och framåt lagras optimerad bytekod i __pycache__ med namn som module.cpython-311.opt-1.pyc (för -O) eller .opt-2.pyc (för -OO). Om du stöter på en .pyo-fil idag härstammar den från Python 2 eller Python 3.0-3.4-kod.
.pyo-filer är inte portabla mellan olika CPython-versioner - det magiska numret ändras vid varje utgåva. Verktyg som uncompyle6 (Python 2-3.8) och decompyle3 (Python 3.7-3.11) kan dekompilera .pyo-filer tillbaka till ungefärlig .py-källkod, även om noggrannheten varierar beroende på Python-version och kodens komplexitet.
Säkerhet & trygghet
RISK: MEDIUMEn .pyo-fil körs som Python-bytekod med alla förmågor hos ett Python-skript - filsystemåtkomst, nätverk, körning av underprocesser. Kör aldrig en .pyo från en otillförlitlig källa. Antivirusprogram skannar ofta inte innehållet i .pyo-filer. Skadliga Python-appar distribueras ibland som enbart bytekod (.pyc/.pyo) för att göra reverse engineering svårare, även om dekompilatorer till stor del kan återställa källkoden.
Formatdetaljer
i ett nötskalProgram som öppnar PYO-filer
Tekniska detaljer
djup specifikation| Formatrelation | Identiskt filformat byte-för-byte med `.pyc`; skiljs endast åt av filändelsen och optimeringsinnehållet |
| Header-struktur | 16-byte header: 4-byte versions-magic + 4-byte flaggor + 4-byte käll-mtime eller hash + 4-byte källstorlek |
| Innehållsformat | Serialiserat CPython-kodobjekt (bytekod-instruktioner, konstantpool, namn, variabelnamn, nästlade kodobjekt) |
| Byteordning | Little-endian (CPython marshal-serialiseringsformat) |
| Optimeringsnivå -O | Tar bort `assert`-satser från kompilerad bytekod |
| Optimeringsnivå -OO | Tar bort `assert`-satser och alla docstrings från kompilerad bytekod |
| Utfasning | Filändelsen `.pyo` togs bort i Python 3.5 (PEP 488, september 2015); genereras inte av någon aktuell Python-utgåva |
| Modern motsvarighet | `module.cpython-3X.opt-1.pyc` (nivå 1) eller `.opt-2.pyc` (nivå 2) lagrad i `__pycache__` |
| Versionsportabilitet | Inte portabel mellan CPython-versioner; det magiska numret i bytes 0-3 ändras med varje större CPython-utgåva |
| Integritetsvalidering | Python 3.7+ (PEP 552): valfri SipHash av källkod lagrad i header-flaggor; Python 2 / tidig 3: endast mtime-jämförelse |
| Dekompileringsverktyg | `uncompyle6` (Python 2-3.8), `decompyle3` (Python 3.7-3.11) |
| Historisk omfattning | Producerades endast av Python 2 eller Python 3.0-3.4; påträffas inte i projekt som siktar på Python 3.5 eller senare |
| Släppt | Early CPython (1990s); same as .pyc but with optimizations (assert removal with -O; docstring removal with -OO) |
| Senaste 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 |
| Öppen standard | Ja · royaltyfri |
| Specifikation | peps.python.org |
PYO-konverteringar
Frågor & svar
frågat av användareInga frågor än - bli den första att fråga om PYO-filer.