Heim  >  Artikel  >  Backend-Entwicklung  >  Das Ausführungsprinzip des Python-Programms

Das Ausführungsprinzip des Python-Programms

巴扎黑
巴扎黑Original
2016-12-08 10:34:241830Durchsuche

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;


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn