1. Prozessübersicht
Python kompiliert zunächst den Code (.py-Datei) in Bytecode und übergibt ihn an die virtuelle Bytecode-Maschine. Anschließend führt die virtuelle Maschine die Bytecode-Anweisungen nacheinander aus, um das Programm abzuschließen. Ausführung.
2. Bytecode
Der Bytecode entspricht dem PyCodeObject-Objekt im Python-Virtual-Machine-Programm.
Die .pyc-Datei ist die Darstellung des Bytecodes auf der Festplatte.
3. Pyc-Datei
Das PyCodeObject-Objekt wird erstellt, wenn das Modul geladen wird, also importiert wird.
Python test.py kompiliert test.py in Bytecode und interpretiert ihn zur Ausführung, generiert jedoch kein test.pyc.
Wenn test.py andere Module lädt, z. B. import util, kompiliert Python util.py in Bytecode, generiert util.pyc und interpretiert und führt dann den Bytecode aus.
Wenn Sie test.pyc generieren möchten, können wir es mit dem in Python integrierten Modul py_compile/compileall kompilieren.
Wenn beim Laden eines Moduls sowohl .py als auch .pyc vorhanden sind, versucht Python, .pyc zu verwenden. Wenn die Kompilierungszeit von .pyc vor der Änderungszeit von .py liegt, wird .py neu kompiliert und .pyc werden aktualisiert.
4. PyCodeObject
Das kompilierte Ergebnis des Python-Codes ist das PyCodeObject-Objekt.
typedef struct {
PyObject_HEAD
int co_argcount; /* Anzahl der Positionsparameter*/
int co_nlocals; /* Anzahl der lokalen Variablen*/
int co_stacksize; /* stack size*/
int co_flags;
PyObject *co_code; /* bytecode command sequence*/
PyObject *co_consts ; /* Satz aller Konstanten*/
PyObject *co_names; /* Satz aller Symbolnamen*/
PyObject *co_varnames; /* Satz lokaler Variablennamen*/
PyObject *co_freevars; /* Der Satz von Variablennamen, die für Abschlüsse verwendet werden*/
PyObject *co_cellvars; /* Der Satz von Variablennamen, auf die von internen verschachtelten Funktionen verwiesen wird*/
/ * Der Rest zählt nicht für Hash/cmp */
PyObject *co_filename; /* Dateiname, in dem sich der Code befindet*/
PyObject *co_name; /* Modulname|Funktion name|Klassenname* /
int co_firstlineno; /* Die Startzeilennummer des Codeblocks in der Datei*/
PyObject *co_lnotab; /* Die entsprechende Beziehung zwischen Bytecode-Anweisungen und Zeile zahlen*/
void *co_zombieframe; /* nur zur Optimierung (siehe frameobject.c) */
} PyCodeObject;