Was ist das PYC-Dateiformat?
.pyc-Dateien werden von der Programmiersprache Python verwendet. Eine .pyc-Datei ist eine ausführbare Datei, die kompilierten Bytecode für ein in Python-Quellcode geschriebenes Programm enthält. Bytecode ist ein Satz von Anweisungen für den Interpreter, um das Programm auszuführen, ohne den ursprünglichen Quellcode bei jedem Start neu zu parsen, was Import- und Startzeit beschleunigt.
.pyc-Dateien werden von ihren zugehörigen .py-Quelldateien begleitet. Python kompiliert eine .py-Datei und speichert das Ergebnis in einer .pyc-Datei, mit der das Programm dann direkt ausgeführt werden kann. Seit Python 3.2 werden diese Cache-Dateien in einem __pycache__-Unterverzeichnis neben dem Quellcode abgelegt, wobei die Interpreter-Version in den Dateinamen eingebettet ist (z. B. script.cpython-312.pyc).
Jede .pyc-Datei beginnt mit einem 16-Byte-Header. Die ersten zwei Bytes sind eine versionsspezifische Magic-Zahl - sie ändert sich mit jeder CPython-Version - gefolgt von 0x0D 0x0A (CR LF) an Bytes 2-3. Die verbleibenden Header-Bytes enthalten entweder einen Quelldatei-Zeitstempel und -Größe (Standard) oder einen Quelldatei-Hash für deterministische, reproduzierbare Builds, ein Schema, das mit PEP 552 in Python 3.7 eingeführt wurde. Nach dem Header enthält die Datei ein marshallisiertes Code-Objekt, das mit Pythons integriertem dis-Modul untersucht werden kann.
.pyc-Bytecode ist an eine bestimmte CPython-Version gebunden - eine unter Python 3.11 kompilierte Datei wird unter Python 3.12 nicht geladen. Das ältere .pyo-Format für optimierten Bytecode wurde in Python 3.5 entfernt; optimierte Builds erzeugen jetzt .opt-1.pyc- oder .opt-2.pyc-Dateien. Zum Dekompilieren einer .pyc-Datei zurück zu lesbarem Quellcode werden Tools wie uncompyle6, decompyle3 und pycdc (Decompyle++) häufig verwendet, wobei die Kompatibilität je nach Python-Version variiert. Unter Windows verwenden kompilierte Erweiterungsmodule das verwandte .pyd-Format.
Sicherheit
RISIKO: MEDIUMEine .pyc-Datei ist Bytecode, den der Python-Interpreter AUSFÜHRT, sodass eine böswillige .pyc-Datei beliebigen Code ausführen kann, genau wie ein Skript - führen Sie niemals eine .pyc-Datei aus einer nicht vertrauenswürdigen Quelle aus. Es ist auch eine gängige Technik zum Verstecken von Malware (nur kompilierten Bytecode ausliefern). Umgekehrt bietet das Verteilen des eigenen Codes als .pyc nur schwachen Schutz: Er kann dekompiliert und zumindest mit dem mitgelieferten 'dis'-Modul disassembliert werden, sodass es KEIN echter Weg ist, Quellcode geheim zu halten. Das Löschen von __pycache__- / .pyc-Dateien ist sicher - Python regeneriert sie automatisch aus den .py-Quellen.
Formatdetails
kurz gefasstProgramme zum Öffnen von PYC-Dateien
Technische Details
technische Spezifikation| Entwickler | Python Software Foundation (CPython) |
| MIME-Typ | application/x-python-code |
| Dateistruktur | Binär - 16-Byte-versionierter Header, gefolgt von einem marshallisierten Python-Code-Objekt |
| Magic-Zahl | Bytes 0-1: versionsspezifischer 2-Byte-Wert (je nach CPython-Version unterschiedlich); Bytes 2-3: immer 0x0D 0x0A (CR LF) |
| Header-Layout | 32-Bit-Magic, 32-Bit-Bitfeld-Flags, dann entweder 32-Bit-mtime + 32-Bit-Quelldateigröße (Zeitstempelmodus) oder ein 32-Bit-Quellhash (PEP 552 Hash-Modus) |
| Cache-Verzeichnis | Seit Python 3.2 in __pycache__/ gespeichert; Dateiname kodiert die Interpreter-Version, z. B. script.cpython-312.pyc |
| Versionskompatibilität | Jede CPython-Version schreibt eine eindeutige Magic-Zahl; eine .pyc von Python 3.11 wird unter 3.12 nicht geladen und umgekehrt |
| Plattformportabilität | Plattformunabhängig innerhalb derselben CPython-Version - dieselbe .pyc läuft unter Windows, macOS und Linux mit einem passenden Interpreter |
| Optimierte Varianten | python -O und python -OO erzeugen .opt-1.pyc und .opt-2.pyc (entfernen Assertions und Docstrings); die .pyo-Erweiterung wurde in Python 3.5 abgeschafft |
| Automatische Generierungssteuerung | CPython schreibt .pyc-Dateien automatisch beim Import; unterdrückt durch das -B-Flag oder die Umgebungsvariable PYTHONDONTWRITEBYTECODE=1 |
| Disassemblierung / Dekompilierung | Pythons integriertes dis-Modul disassembliert Bytecode; Drittanbieter-Tools uncompyle6, decompyle3 und pycdc (Decompyle++) versuchen eine Quellcode-Rekonstruktion |
| Internes Serialisierungsformat | Code-Objekte werden mit dem marshal-Modul serialisiert - ein kompaktes Binärformat, das sich von pickle unterscheidet und nicht Teil der stabilen öffentlichen API ist |
| Hash-basierte Builds | PEP 552 (Python 3.7+) führte Hash-basierte .pyc-Dateien ein: Der Header speichert einen Quelldatei-Hash anstelle von mtime für reproduzierbare Builds |
| Veröffentlicht | Early CPython (1990s); current header layout (PEP 552 hash-based, deterministic) since Python 3.7, 2018 |
| Offener Standard | Ja · lizenzgebührenfrei |
| Spezifikation | docs.python.org |
PYC-Konvertierungen
Community Q&A
von Nutzern gefragtNoch keine Fragen - stellen Sie die erste Frage zu PYC-Dateien.