2017-11-29 2 views
1

Ich habe den CPython-Quellcode untersucht, wobei python.h den Import für die meisten Module durchführt. Nur durch das Verfolgen des Codes kann ich den Punkt nicht finden, an dem die Py_Main() Routine in dem Bereich platziert wird.In CPython, wo kommt Py_Main in den Geltungsbereich?

ich die Definition tat finden Py_Main innerhalb Modules/main.c sowie den Prototyp in include/pylifecycle.h, ich kann einfach nicht zu Stück scheinen zusammen, wo sie von importiert wird immer, oder, wenn dies auf der Ebene des Linkers mit make getan.

TLDR: #include "python.h", Py_Main ist jetzt in scope ... an welchem ​​Punkt wurde es dort injiziert?

Antwort

1

Py_Main in pylifecycle.h erklärt:

PyAPI_FUNC(int) Py_Main(int argc, wchar_t **argv); 

pylifecycle.h in Python.h enthalten ist:

#include "pylifecycle.h" 

Wenn Sie #include "Python.h" schreiben, wird pylifecycle.h automatisch eingeschlossen und Sie erhalten Py_Main.

Das war über die Funktion Erklärung, was ist nun mit seinem Code?

Für CPython selbst:

Wenn Python aufgebaut ist, die jeweils .c Datei im Python directory wird in ein Objekt (.o) Datei durch den C-Compiler kompiliert. Objektdateien sind dann statically linked zusammen in einer eigenständigen ausführbaren Datei. Unter Linux ist der übliche Linker GNU ld.

Für Module von Drittanbietern:

Für Module, die die Python-API, der Code für Py_Main verwenden möchten nicht enthalten ist: es wird zur Laufzeit durch die dynamic linker geladen.

Unter Linux (und ähnlich auf anderen Systemen) wird der kompilierte Python-Code auf zwei Arten geliefert: als eigenständige ausführbare Datei python und als gemeinsam genutzte Bibliothek python.so. Beide enthalten den Code für Py_Main und alle anderen Funktionen.

+0

Das ist mir aufgefallen. Die eigentliche Definition befindet sich jedoch in der Datei 'Modules/main.c', auf die ich im Code keine Referenzen sehe. – SamuelN

+0

@SamuelN: Wenn Sie sich fragen, wie die Funktion kompiliert und verknüpft wird, ist das ein ganz anderes Problem als das, was Sie gefragt haben. – user2357112

+0

@ user2357112 Ja, deshalb habe ich das in meine Frage '' aufgenommen oder wenn dies auf der Linker-Ebene mit make "' gemacht wird. Danke fürs klarstellen! – SamuelN

Verwandte Themen