Hva er PYC-filformatet?
.pyc-filer brukes av programmeringsspråket Python. En .pyc-fil er en kjørbar fil som inneholder kompilert bytecode for et program skrevet i Python-kildekode. Bytecode er et sett med instruksjoner for tolken (interpreter) for å kjøre programmet uten å måtte tolke den opprinnelige kildekoden på nytt ved hver oppstart, noe som øker hastigheten på import og oppstartstid.
.pyc-filer følges av sine relaterte .py-kildekodefiler. Python kompilerer en .py-fil og lagrer resultatet i en .pyc-fil, som deretter kan brukes til å kjøre programmet direkte. Siden Python 3.2 blir disse bufferfilene plassert i en __pycache__-undermappe ved siden av kildekoden, med tolkens versjon innebygd i filnavnet (for eksempel script.cpython-312.pyc).
Hver .pyc-fil begynner med et 16-byte hode (header). De første to bytene er et versjonsspesifikt «magic number» - det endres med hver CPython-utgivelse - etterfulgt av 0x0D 0x0A (CR LF) ved byte 2-3. De resterende hode-bytene inneholder enten kildekodens tidsstempel og størrelse (standard) eller en kildekode-hash for deterministiske, reproduserbare bygg, en ordning introdusert av PEP 552 i Python 3.7. Etter hodet inneholder filen et «marshalled» kodeobjekt som kan inspiseres med Pythons innebygde dis-modul.
.pyc-bytecode er knyttet til en spesifikk CPython-versjon - en fil kompilert under Python 3.11 vil ikke lastes under Python 3.12. Det eldre .pyo formatet for optimalisert bytecode ble fjernet i Python 3.5; optimaliserte bygg produserer nå .opt-1.pyc eller .opt-2.pyc-filer i stedet. For å dekompilere en .pyc tilbake til lesbar kildekode, brukes ofte verktøy som uncompyle6, decompyle3 og pycdc (Decompyle++), selv om kompatibiliteten varierer etter Python-versjon. På Windows bruker kompilerte utvidelsesmoduler det relaterte .pyd-formatet.
Sikkerhet og trygghet
RISIKO: MEDIUMEn .pyc er bytecode som Python-tolken UTFØRER, så en ondsinnet .pyc kan kjøre vilkårlig kode akkurat som et skript - kjør aldri en .pyc fra en upålitelig kilde. Det er også en vanlig teknikk for å skjule skadevare (ved å kun sende kompilert bytecode). Motsatt gir distribusjon av egen kode som .pyc svært svak beskyttelse: den kan dekompileres og, som et minimum, demonteres med den medfølgende «dis»-modulen, så det er IKKE en reell måte å holde kildekoden hemmelig på. Sletting av __pycache__ / .pyc-filer er trygt - Python regenererer dem automatisk fra .py-kildene.
Formatdetaljer
i et nøtteskallProgrammer som åpner PYC-filer
Tekniske detaljer
dyp spesifikasjon| Utvikler | Python Software Foundation (CPython) |
| MIME-type | application/x-python-code |
| Filstruktur | Binær - 16-byte versjonert hode etterfulgt av et marshalled Python-kodeobjekt |
| Magic number | Byte 0-1: versjonsspesifikk 2-byte verdi (varierer per CPython-utgivelse); byte 2-3: alltid 0x0D 0x0A (CR LF) |
| Hode-layout | 32-bit magic, 32-bit bitfelt-flagg, deretter enten 32-bit mtime + 32-bit kildestørrelse (tidsstempel-modus) eller en 32-bit kilde-hash (PEP 552 hash-modus) |
| Buffer-mappe | Lagret i __pycache__/ siden Python 3.2; filnavnet koder tolkens versjon, f.eks. script.cpython-312.pyc |
| Versjonskompatibilitet | Hver CPython-versjon skriver et unikt magic number; en .pyc fra Python 3.11 vil ikke lastes under 3.12 og omvendt |
| Plattform-portabilitet | Plattformuavhengig innenfor samme CPython-versjon - samme .pyc kjører på Windows, macOS og Linux med en samsvarende tolk |
| Optimaliserte varianter | python -O og python -OO produserer .opt-1.pyc og .opt-2.pyc (fjerner asserts og docstrings); .pyo-utvidelsen ble pensjonert i Python 3.5 |
| Kontroll av autogenerering | CPython skriver .pyc-filer automatisk ved import; undertrykkes av -B-flagget eller miljøvariabelen PYTHONDONTWRITEBYTECODE=1 |
| Demontering / dekompilering | Pythons innebygde dis-modul demonterer bytecode; tredjepartsverktøy uncompyle6, decompyle3 og pycdc (Decompyle++) forsøker kildekoderekonstruksjon |
| Internt serialiseringsformat | Kodeobjekter serialiseres med marshal-modulen - et kompakt binærformat forskjellig fra pickle, ikke en del av det stabile offentlige API-et |
| Hash-baserte bygg | PEP 552 (Python 3.7+) introduserte hash-baserte .pyc-filer: hodet lagrer en kildekode-hash i stedet for mtime for reproduserbare bygg |
| Utgitt | Early CPython (1990s); current header layout (PEP 552 hash-based, deterministic) since Python 3.7, 2018 |
| Åpen standard | Ja · royalty-fri |
| Spesifikasjon | docs.python.org |
PYC-konverteringer
Spørsmål og svar fra fellesskapet
spurt av brukereIngen spørsmål ennå - vær den første til å spørre om PYC-filer.