Che cos'è il formato di file PYC?
I file .pyc sono utilizzati dal linguaggio di programmazione Python. Un file .pyc è un eseguibile che contiene bytecode compilato per un programma scritto in sorgente Python. Il bytecode è un insieme di istruzioni per l'interprete per eseguire il programma senza dover rianalizzare il sorgente originale a ogni avvio, il che accelera i tempi di importazione e di avvio.
I file .pyc sono accompagnati dai relativi file sorgente .py. Python compila un file .py e salva il risultato in un file .pyc, che può quindi essere utilizzato per eseguire direttamente il programma. A partire da Python 3.2, questi file di cache sono inseriti in una sottodirectory __pycache__ accanto al sorgente, con la versione dell'interprete incorporata nel nome del file (ad esempio, script.cpython-312.pyc).
Ogni file .pyc inizia con un'intestazione di 16 byte. I primi due byte sono un numero magico specifico della versione - cambia con ogni rilascio di CPython - seguito da 0x0D 0x0A (CR LF) ai byte 2-3. I restanti byte dell'intestazione contengono un timestamp e la dimensione del file sorgente (impostazione predefinita) o un hash del file sorgente per build deterministiche e riproducibili, uno schema introdotto dalla PEP 552 in Python 3.7. Dopo l'intestazione, il file contiene un oggetto di codice serializzato (marshalled) che può essere ispezionato con il modulo integrato dis di Python.
Il bytecode .pyc è legato a una versione specifica di CPython - un file compilato con Python 3.11 non verrà caricato con Python 3.12. Il vecchio formato di bytecode ottimizzato .pyo è stato rimosso in Python 3.5; le build ottimizzate ora producono invece file .opt-1.pyc o .opt-2.pyc. Per decompilare un .pyc e tornare a un sorgente leggibile, vengono comunemente usati strumenti come uncompyle6, decompyle3 e pycdc (Decompyle++), sebbene la compatibilità vari in base alla versione di Python. Su Windows, i moduli di estensione compilati utilizzano il formato correlato .pyd.
Sicurezza e incolumità
RISCHIO: MEDIUMUn .pyc è bytecode che l'interprete Python ESEGUE, quindi un .pyc malevolo può eseguire codice arbitrario proprio come uno script - non eseguire mai un .pyc da una fonte non attendibile. È anche una tecnica comune per nascondere malware (distribuendo solo il bytecode compilato). Al contrario, distribuire il proprio codice come .pyc offre una protezione molto debole: può essere decompilato e, come minimo, disassemblato con il modulo «dis» incluso, quindi NON è un modo reale per mantenere segreto il sorgente. Eliminare i file __pycache__ / .pyc è sicuro - Python li rigenera automaticamente dai sorgenti .py.
Dettagli del formato
in sintesiProgrammi che aprono file PYC
Dettagli tecnici
specifiche approfondite| Sviluppatore | Python Software Foundation (CPython) |
| Tipo MIME | application/x-python-code |
| Struttura del file | Binario - intestazione con versione di 16 byte seguita da un oggetto di codice Python serializzato (marshalled) |
| Numero magico | Byte 0-1: valore di 2 byte specifico della versione (differisce per ogni rilascio di CPython); byte 2-3: sempre 0x0D 0x0A (CR LF) |
| Layout intestazione | Magic a 32 bit, flag bit-field a 32 bit, poi mtime a 32 bit + dimensione sorgente a 32 bit (modalità timestamp) o un hash del sorgente a 32 bit (modalità hash PEP 552) |
| Directory cache | Memorizzato in __pycache__/ da Python 3.2; il nome del file codifica la versione dell'interprete, es. script.cpython-312.pyc |
| Compatibilità versione | Ogni versione di CPython scrive un numero magico univoco; un .pyc di Python 3.11 non verrà caricato sotto 3.12 e viceversa |
| Portabilità della piattaforma | Indipendente dalla piattaforma all'interno della stessa versione di CPython - lo stesso .pyc gira su Windows, macOS e Linux con un interprete corrispondente |
| Varianti ottimizzate | python -O e python -OO producono .opt-1.pyc e .opt-2.pyc (rimuovono assert e docstring); l'estensione .pyo è stata ritirata in Python 3.5 |
| Controllo auto-generazione | CPython scrive i file .pyc automaticamente all'importazione; soppresso dal flag -B o dalla variabile d'ambiente PYTHONDONTWRITEBYTECODE=1 |
| Disassemblaggio / decompilazione | Il modulo integrato dis di Python disassembla il bytecode; strumenti di terze parti uncompyle6, decompyle3 e pycdc (Decompyle++) tentano la ricostruzione del sorgente |
| Formato di serializzazione interna | Gli oggetti di codice sono serializzati con il modulo marshal - un formato binario compatto distinto da pickle, non facente parte dell'API pubblica stabile |
| Build basate su hash | La PEP 552 (Python 3.7+) ha introdotto i file .pyc basati su hash: l'intestazione memorizza un hash del file sorgente invece di mtime per build riproducibili |
| Rilasciato | Early CPython (1990s); current header layout (PEP 552 hash-based, deterministic) since Python 3.7, 2018 |
| Standard aperto | Sì · royalty-free |
| Specifica | docs.python.org |
Conversioni PYC
Domande e risposte della community
chiesto dagli utentiAncora nessuna domanda - sii il primo a chiedere informazioni sui file PYC.