Vad är filformatet PYC?
.pyc-filer används av programmeringsspråket Python. En .pyc-fil är en körbar fil som innehåller kompilerad bytecode för ett program skrivet i Python-källkod. Bytecode är en uppsättning instruktioner för tolken att köra programmet utan att behöva parsa om den ursprungliga källkoden vid varje start, vilket påskyndar import- och uppstartstid.
.pyc-filer åtföljs av sina relaterade .py-källkodsfiler. Python kompilerar en .py-fil och sparar resultatet i en .pyc-fil, som sedan kan användas för att köra programmet direkt. Sedan Python 3.2 placeras dessa cachefiler i en underkatalog vid namn __pycache__ bredvid källkoden, med tolkens version inbäddad i filnamnet (till exempel script.cpython-312.pyc).
Varje .pyc-fil börjar med en 16-byte header. De första två byten är ett versionsspecifikt «magic number» - det ändras med varje CPython-utgåva - följt av 0x0D 0x0A (CR LF) vid byte 2-3. De återstående header-byten innehåller antingen källfilens tidsstämpel och storlek (standard) eller en hash av källfilen för deterministiska, reproducerbara byggen, ett schema som introducerades av PEP 552 i Python 3.7. Efter headern innehåller filen ett «marshalled» kodobjekt som kan inspekteras med Pythons inbyggda dis-modul.
.pyc-bytecode är bunden till en specifik CPython-version - en fil kompilerad under Python 3.11 kommer inte att laddas under Python 3.12. Det äldre .pyo-formatet för optimerad bytecode togs bort i Python 3.5; optimerade byggen skapar nu istället .opt-1.pyc- eller .opt-2.pyc-filer. För att dekompilera en .pyc tillbaka till läsbar källkod används ofta verktyg som uncompyle6, decompyle3 och pycdc (Decompyle++), även om kompatibiliteten varierar beroende på Python-version. På Windows använder kompilerade tilläggsmoduler det relaterade .pyd-formatet.
Säkerhet & trygghet
RISK: MEDIUMEn .pyc är bytecode som Python-tolken EXEKVERAR, så en skadlig .pyc kan köra godtycklig kod precis som ett skript - kör aldrig en .pyc från en okänd källa. Det är också en vanlig teknik för att dölja skadlig kod (genom att endast skicka med kompilerad bytecode). Omvänt ger distribution av din egen kod som .pyc ett mycket svagt skydd: den kan dekompileras och åtminstone tas isär med den medföljande «dis»-modulen, så det är INTE ett riktigt sätt att hålla källkod hemlig. Att radera __pycache__ / .pyc-filer är säkert - Python återskapar dem automatiskt från .py-källkoden.
Formatdetaljer
i ett nötskalProgram som öppnar PYC-filer
Tekniska detaljer
djup specifikation| Utvecklare | Python Software Foundation (CPython) |
| MIME-typ | application/x-python-code |
| Filstruktur | Binär - 16-byte versionshanterad header följt av ett marshalled Python-kodobjekt |
| Magic number | Byte 0-1: versionsspecifikt 2-byte-värde (skiljer sig per CPython-utgåva); byte 2-3: alltid 0x0D 0x0A (CR LF) |
| Header-layout | 32-bitars magic, 32-bitars bit-field-flaggor, sedan antingen 32-bitars mtime + 32-bitars källstorlek (tidsstämpelläge) eller en 32-bitars källhash (PEP 552 hash-läge) |
| Cache-katalog | Lagras i __pycache__/ sedan Python 3.2; filnamnet kodar tolkens version, t.ex. script.cpython-312.pyc |
| Versionskompatibilitet | Varje CPython-version skriver ett unikt magic number; en .pyc från Python 3.11 kommer inte att laddas under 3.12 och vice versa |
| Plattformsoberoende | Plattformsoberoende inom samma CPython-version - samma .pyc körs på Windows, macOS och Linux med en matchande tolk |
| Optimerade varianter | python -O och python -OO skapar .opt-1.pyc och .opt-2.pyc (tar bort asserts och docstrings); filändelsen .pyo pensionerades i Python 3.5 |
| Kontroll av autogenerering | CPython skriver .pyc-filer automatiskt vid import; undertrycks med flaggan -B eller miljövariabeln PYTHONDONTWRITEBYTECODE=1 |
| Disassembly / dekompilering | Pythons inbyggda dis-modul tar isär bytecode; tredjepartsverktyg som uncompyle6, decompyle3 och pycdc (Decompyle++) försöker rekonstruera källkoden |
| Internt serialiseringsformat | Kodobjekt serialiseras med modulen marshal - ett kompakt binärt format skilt från pickle, inte en del av det stabila publika API:et |
| Hash-baserade byggen | PEP 552 (Python 3.7+) introducerade hash-baserade .pyc-filer: headern lagrar en hash av källfilen istället för mtime för reproducerbara byggen |
| Släppt | Early CPython (1990s); current header layout (PEP 552 hash-based, deterministic) since Python 3.7, 2018 |
| Öppen standard | Ja · royaltyfri |
| Specifikation | docs.python.org |
PYC-konverteringar
Frågor & svar
frågat av användareInga frågor än - bli den första att fråga om PYC-filer.