杰瑞科技汇

gehonntoo下如何用gcc编译Python代码?

Hallo! "Gehonntoo" klingt nach einem Tippfehler oder einer bestimmten Dialekt/Aussprache. Ich nehme mal an, Sie meinen "gehört zu" oder "gehört dazu".

gehonntoo下如何用gcc编译Python代码?-图1
(图片来源网络,侵删)

Wenn Sie fragen, wie man GCC (GNU Compiler Collection) und Python zusammen verwendet, dann ist das eine sehr gute und häufige Frage. Die kurze Antwort lautet:

Python wird mit GCC nicht direkt "kompiliert", aber Python kann Programme, die mit GCC kompiliert wurden (z.B. in C oder C++), aufrufen und deren Funktionalität nutzen.

Hier sind die gängigsten Szenarien, wie die beiden zusammenarbeiten:


Szenario 1: Python ruft C/C++-Code auf (Das häufigste Szenario)

Manchmal ist ein Teil Ihres Python-Programms performancekritisch. Anstatt diesen Teil in Python zu schreiben (was langsamer sein kann), schreiben Sie ihn in C oder C++, kompilieren ihn mit GCC zu einer dynamischen Bibliothek (.so auf Linux/macOS oder .pyd auf Windows) und importieren diese Bibliothek dann in Python.

gehonntoo下如何用gcc编译Python代码?-图2
(图片来源网络,侵删)

Schritt-für-Schritt-Anleitung (Beispiel mit C)

C-Code schreiben (meine_funktion.c)

Schreiben Sie Ihre C-Funktion. Wichtig ist, dass Sie die Header-Datei Python.h inkludieren, um mit der C-API von Python kommunizieren zu können.

// meine_funktion.c
#include <Python.h>
// Unsere C-Funktion, die zwei Zahlen addiert
static PyObject* addiere_zahlen(PyObject* self, PyObject* args) {
    double a, b;
    // Die Funktion liest zwei Argumente aus dem Python-Aufruf
    if (!PyArg_ParseTuple(args, "dd", &a, &b)) {
        return NULL; // Fehler, wenn die Argumente falsch sind
    }
    // Das Ergebnis wird als Python-Float-Objekt zurückgegeben
    return PyFloat_FromDouble(a + b);
}
// Dies ist die "Definition" unserer Moduls in Python
static PyMethodDef MeineMethoden[] = {
    {"addiere", addiere_zahlen, METH_VARARGS, "Addiert zwei Zahlen."},
    {NULL, NULL, 0, NULL} // Sentinel, das das Ende der Methodenliste markiert
};
static struct PyModuleDef meinmodul = {
    PyModuleDef_HEAD_INIT,
    "mein_c_modul", // Name des Moduls in Python
    NULL,
    -1,
    MeineMethoden
};
// Diese Funktion wird von Python aufgerufen, um das Modul zu initialisieren
PyMODINIT_FUNC PyInit_mein_c_modul(void) {
    return PyModule_Create(&meinmodul);
}

Mit GCC kompilieren

Sie müssen GCC anweisen, eine C-Datei in eine Python-erweiterbare Bibliothek zu kompilieren. Die genauen Flags hängen von Ihrer Python-Version und Ihrem Betriebssystem ab.

gehonntoo下如何用gcc编译Python代码?-图3
(图片来源网络,侵删)

Finden Sie zuerst die Include- und Bibliothekspfade für Ihr Python:

# Für Python 3.x (ersetzen Sie 3.10 durch Ihre Version)
python3-config --cflags
python3-config --ldflags

Jetzt kompilieren Sie:

gcc -shared -fPIC $(python3-config --cflags) -o mein_c_modul.so $(python3-config --ldflags) meine_funktion.c
  • -shared: Erzeugt eine dynamische Bibliothek (Shared Object).
  • -fPIC: "Position Independent Code", erforderlich für Shared Libraries.
  • $(python3-config --cflags): Fügt die Include-Pfade und andere Compiler-Flags für Python hinzu.
  • $(python3-config --ldflags): Fügt die Bibliothekspfade und Linker-Flags für Python hinzu.
  • -o mein_c_modul.so: Gibt der Ausgabedatei einen Namen.
  • meine_funktion.c: Ihre C-Quelldatei.

In Python importieren und verwenden

Jetzt können Sie die kompilierte .so-Datei wie ein normales Python-Modul importieren.

# mein_skript.py
import mein_c_modul
# Die Funktion aus dem C-Code aufrufen
ergebnis = mein_c_modul.addiere(5.5, 10.2)
print(f"Ergebnis aus C: {ergebnis}")

Ausgabe:

Ergebnis aus C: 15.7

Szenario 2: Python als Build-Tool für C/C++-Projekte

In vielen C/C++-Projekten wird CMake als Build-System verwendet. CMake ist plattformunabhängig und kann die Konfiguration automatisch für verschiedene Compiler (wie GCC) und auch für Python durchführen.

Ein CMake-Setup könnte so aussehen:

  • CMakeLists.txt:

    cmake_minimum_required(VERSION 3.10)
    project(MeinCProjekt)
    # Finde Python und seine Bibliotheken
    find_package(Python COMPONENTS Interpreter Development REQUIRED)
    # Führe eine Python-Skript aus, um etwas vorzubereiten
    add_custom_command(
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/daten.txt
        COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generate_data.py
        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/generate_data.py
    )
    # Erstelle eine ausführbare Datei aus einem C++-Source
    add_executable(mein_programm main.cpp)

In diesem Fall nutzt Python die "Build-Logik" des Projekts, während GCC (über CMake) den eigentlichen Code kompiliert.


Szenario 3: Cython – Eine Brücke zwischen Python und C

Cython ist eine Erweiterung für Python, die es ermöglicht, Code in einer Sprache zu schreiben, die sehr an Python erinnert, aber auch statische C-Typen verwenden kann. Dieser Cython-Code wird dann von Cython in C-Code umgewandelt, den man anschließend mit GCC kompiliert, um eine sehr schnelle Python-Erweiterung zu erstellen.

  1. .pyx-Datei schreiben: Eine Mischung aus Python und C-Typen.
  2. setup.py-Datei erstellen: Ein Skript, das den Kompilierungsprozess steuert.
  3. Befehl ausführen: python setup.py build_ext --inplace
    • Cython übersetzt die .pyx-Datei in eine .c-Datei.
    • setup.py ruft dann GCC auf, um diese .c-Datei in eine .so/.pyd-Datei zu kompilieren.

Dies ist eine sehr effiziente Methode, um Python-Code zu beschleunigen.


Zusammenfassung

Szenario Beschreibung Wie GCC und Python zusammenarbeiten
C-Erweiterung Python ruft eine in C/C++ geschriebene Funktion auf. Python ruft GCC auf, um C-Code in eine Bibliothek zu kompilieren, die es dann importieren kann.
Build-System Python wird in einem C/C++-Build-Prozess (z.B. mit CMake) verwendet. Python wird als Skript-Sprache im Build-Prozess verwendet, während GCC der eigentliche Compiler ist.
Cython Python-Code wird mit Cython in C übersetzt, um ihn zu beschleunigen. Cython generiert C-Code, der dann mit GCC kompiliert wird, um eine schnelle Python-Erweiterung zu erstellen.

Die häufigste und wichtigste Interaktion ist Szenario 1: die Erstellung von C-Erweiterungen für Python mit GCC.

分享:
扫描分享到社交APP
上一篇
下一篇