Wat is het PYC-bestandsformaat?
.pyc-bestanden worden gebruikt door de programmeertaal Python. Een .pyc-bestand is een uitvoerbaar bestand dat gecompileerde bytecode bevat voor een programma geschreven in Python-broncode. Bytecode is een set instructies voor de interpreter om het programma uit te voeren zonder de originele broncode bij elke start opnieuw te hoeven analyseren, wat de import- en opstarttijd versnelt.
.pyc-bestanden gaan vergezeld van hun gerelateerde .py-bronbestanden. Python compileert een .py-bestand en slaat het resultaat op in een .pyc-bestand, dat vervolgens kan worden gebruikt om het programma direct uit te voeren. Sinds Python 3.2 worden deze cachebestanden geplaatst in een __pycache__-submap naast de broncode, waarbij de versie van de interpreter in de bestandsnaam is ingebed (bijvoorbeeld script.cpython-312.pyc).
Elk .pyc-bestand begint met een header van 16 bytes. De eerste twee bytes zijn een versiespecifiek „magic number” - dit verandert bij elke CPython-release - gevolgd door 0x0D 0x0A (CR LF) op bytes 2-3. De resterende header-bytes bevatten ofwel een tijdstempel en grootte van het bronbestand (de standaard) of een hash van het bronbestand voor deterministische, reproduceerbare builds, een schema geïntroduceerd door PEP 552 in Python 3.7. Na de header bevat het bestand een „marshalled” code-object dat kan worden geïnspecteerd met de ingebouwde dis-module van Python.
.pyc-bytecode is gebonden aan een specifieke CPython-versie - een bestand gecompileerd onder Python 3.11 zal niet laden onder Python 3.12. Het oudere .pyo geoptimaliseerde bytecode-formaat is verwijderd in Python 3.5; geoptimaliseerde builds produceren nu in plaats daarvan .opt-1.pyc of .opt-2.pyc bestanden. Om een .pyc te decompileren naar leesbare broncode, worden tools zoals uncompyle6, decompyle3 en pycdc (Decompyle++) veel gebruikt, hoewel de compatibiliteit varieert per Python-versie. Op Windows gebruiken gecompileerde extensiemodules het gerelateerde .pyd formaat.
Beveiliging & veiligheid
RISICO: MEDIUMEen .pyc is bytecode die de Python-interpreter UITVOERT, dus een kwaadaardige .pyc kan willekeurige code uitvoeren net als een script - voer nooit een .pyc uit van een onbetrouwbare bron. Het is ook een veelgebruikte techniek voor het verbergen van malware (alleen gecompileerde bytecode leveren). Omgekeerd biedt het distribueren van uw eigen code als .pyc zeer zwakke bescherming: het kan worden gedecompileerd en, op zijn minst, worden gedemonteerd met de meegeleverde „dis”-module, dus het is GEEN echte manier om broncode geheim te houden. Het verwijderen van __pycache__ / .pyc-bestanden is veilig - Python genereert ze automatisch opnieuw uit de .py-bronbestanden.
Formaatdetails
in een notendopProgramma's die PYC-bestanden openen
Technische details
diepe specificaties| Ontwikkelaar | Python Software Foundation (CPython) |
| MIME-type | application/x-python-code |
| Bestandsstructuur | Binair - 16-byte header met versie-informatie gevolgd door een marshalled Python code-object |
| Magic number | Bytes 0-1: versiespecifieke 2-byte waarde (verschilt per CPython-release); bytes 2-3: altijd 0x0D 0x0A (CR LF) |
| Header-indeling | 32-bit magic, 32-bit bit-field vlaggen, dan ofwel 32-bit mtime + 32-bit brongrootte (tijdstempelmodus) of een 32-bit bron-hash (PEP 552 hash-modus) |
| Cache-map | Opgeslagen in __pycache__/ sinds Python 3.2; bestandsnaam codeert de interpreterversie, bijv. script.cpython-312.pyc |
| Versiecompatibiliteit | Elke CPython-versie schrijft een uniek magic number; een .pyc van Python 3.11 zal niet laden onder 3.12 en vice versa |
| Platform-portabiliteit | Platformonafhankelijk binnen dezelfde CPython-versie - dezelfde .pyc draait op Windows, macOS en Linux met een bijpassende interpreter |
| Geoptimaliseerde varianten | python -O en python -OO produceren .opt-1.pyc en .opt-2.pyc (verwijdert asserts en docstrings); de .pyo-extensie is vervallen in Python 3.5 |
| Controle over automatische generatie | CPython schrijft automatisch .pyc-bestanden bij import; onderdrukt door de -B vlag of PYTHONDONTWRITEBYTECODE=1 omgevingsvariabele |
| Disassembly / decompilatie | De ingebouwde dis-module van Python demonteert bytecode; externe tools uncompyle6, decompyle3 en pycdc (Decompyle++) proberen de broncode te reconstrueren |
| Intern serialisatieformaat | Code-objecten worden geserialiseerd met de marshal-module - een compact binair formaat dat verschilt van pickle en geen deel uitmaakt van de stabiele publieke API |
| Op hash gebaseerde builds | PEP 552 (Python 3.7+) introduceerde op hash gebaseerde .pyc-bestanden: de header slaat een bronbestand-hash op in plaats van mtime voor reproduceerbare builds |
| Uitgebracht | Early CPython (1990s); current header layout (PEP 552 hash-based, deterministic) since Python 3.7, 2018 |
| Open standaard | Ja · royaltyvrij |
| Specificatie | docs.python.org |
PYC conversies
Community V&A
gevraagd door gebruikersNog geen vragen - wees de eerste om iets te vragen over PYC-bestanden.