Hvad er PYC-filformatet?
.pyc-filer bruges af programmeringssproget Python. En .pyc-fil er en eksekverbar fil, der indeholder kompileret bytecode til et program skrevet i Python-kildekode. Bytecode er et sæt instruktioner til fortolkeren, så den kan køre programmet uden at skulle gen-analysere den oprindelige kildekode ved hver opstart, hvilket fremskynder import- og opstartstid.
.pyc-filer ledsages af deres relaterede .py-kildekodefiler. Python kompilerer en .py-fil og gemmer resultatet i en .pyc-fil, som derefter kan bruges til at køre programmet direkte. Siden Python 3.2 placeres disse cache-filer i en __pycache__-undermappe ved siden af kildekoden, med fortolkerversionen indlejret i filnavnet (for eksempel script.cpython-312.pyc).
Hver .pyc-fil begynder med en 16-byte header. De første to bytes er et versionsspecifikt «magic number» - det ændres ved hver CPython-udgivelse - efterfulgt af 0x0D 0x0A (CR LF) ved byte 2-3. De resterende header-bytes indeholder enten et tidsstempel og størrelse for kildekoden (standard) eller en hash af kildekoden til deterministiske, reproducerbare builds, en ordning introduceret af PEP 552 i Python 3.7. Efter headeren indeholder filen et «marshalled» kodeobjekt, der kan inspiceres med Pythons indbyggede dis-modul.
.pyc-bytecode er bundet til en specifik CPython-version - en fil kompileret under Python 3.11 vil ikke kunne indlæses under Python 3.12. Det ældre .pyo optimerede bytecode-format blev fjernet i Python 3.5; optimerede builds producerer nu .opt-1.pyc eller .opt-2.pyc filer i stedet. For at dekompilere en .pyc tilbage til læsbar kildekode bruges værktøjer som uncompyle6, decompyle3 og pycdc (Decompyle++) ofte, selvom kompatibiliteten varierer efter Python-version. På Windows bruger kompilerede udvidelsesmoduler det relaterede .pyd format.
Sikkerhed og tryghed
RISIKO: MEDIUMEn .pyc er bytecode, som Python-fortolkeren EKSEKVERER, så en ondsindet .pyc kan køre vilkårlig kode ligesom et script - kør aldrig en .pyc fra en upålidelig kilde. Det er også en almindelig teknik til at skjule malware (ved kun at sende kompileret bytecode). Omvendt giver distribution af din egen kode som .pyc meget svag beskyttelse: den kan dekompileres og som minimum skilles ad med det medfølgende «dis»-modul, så det er IKKE en reel måde at holde kildekoden hemmelig på. Sletning af __pycache__ / .pyc-filer er sikkert - Python regenererer dem automatisk fra .py-kilderne.
Formatdetaljer
kort fortaltProgrammer der åbner PYC-filer
Tekniske detaljer
dyb specifikation| Udvikler | Python Software Foundation (CPython) |
| MIME-type | application/x-python-code |
| Filstruktur | Binær - 16-byte versioneret header efterfulgt af et marshalled Python-kodeobjekt |
| Magic number | Byte 0-1: versionsspecifik 2-byte værdi (varierer per CPython-udgivelse); byte 2-3: altid 0x0D 0x0A (CR LF) |
| Header-layout | 32-bit magic, 32-bit bit-felt flag, derefter enten 32-bit mtime + 32-bit kildestørrelse (tidsstempel-tilstand) eller en 32-bit kilde-hash (PEP 552 hash-tilstand) |
| Cache-mappe | Gemt i __pycache__/ siden Python 3.2; filnavnet koder fortolkerversionen, f.eks. script.cpython-312.pyc |
| Versionskompatibilitet | Hver CPython-version skriver et unikt magic number; en .pyc fra Python 3.11 vil ikke indlæses under 3.12 og omvendt |
| Platform-portabilitet | Platformuafhængig inden for samme CPython-version - den samme .pyc kører på Windows, macOS og Linux med en matchende fortolker |
| Optimerede varianter | python -O og python -OO producerer .opt-1.pyc og .opt-2.pyc (fjerner asserts og docstrings); .pyo-filtypen blev pensioneret i Python 3.5 |
| Styring af autogenerering | CPython skriver .pyc-filer automatisk ved import; undertrykkes af -B flaget eller miljøvariablen PYTHONDONTWRITEBYTECODE=1 |
| Disassembly / dekompilering | Pythons indbyggede dis-modul skiller bytecode ad; tredjepartsværktøjer uncompyle6, decompyle3 og pycdc (Decompyle++) forsøger kildekoderekonstruktion |
| Internt serialiseringsformat | Kodeobjekter serialiseres med marshal-modulet - et kompakt binært format adskilt fra pickle, ikke en del af den stabile offentlige API |
| Hash-baserede builds | PEP 552 (Python 3.7+) introducerede hash-baserede .pyc-filer: headeren gemmer en kildekode-hash i stedet for mtime for reproducerbare builds |
| Udgivet | Early CPython (1990s); current header layout (PEP 552 hash-based, deterministic) since Python 3.7, 2018 |
| Åben standard | Ja · royaltyfri |
| Specifikation | docs.python.org |
PYC-konverteringer
Fællesskabets Q&A
spurgt af brugereIngen spørgsmål endnu - vær den første til at spørge om PYC-filer.