L | F | D | W |
|
|---|---|
|
Python C-Module Um Python mit C-Code zu verwenden, muss das vorhandene *.c-File um ein paar spezifische Codeteile ergänzt werden. Da das sehr ausführlich in den Python-Dokumentionen beschrieben wird, gehe ich nur auf die wesentlichen Teile ein. Drei einfache Bespiele, möchte ich hier zeigen.
Alle drei Beispiele folgen demselben Schema. Einen, das für mich funktioniert. Jedoch sind noch sehr viel komplexere Module möglich, und dazu ist jedoch einiges an Verständnis zur C- und Pythonprogrammierung erforderlich. 1. Parameterübergabe von einem String In diesem Beispiel wird ein Filename übergeben und die entsprechende Inodenummer zurückgegeben. Dafür wird eine C-Klasse sys/stat.h im C-Module verwendet, die nur für Linux zur Verfügung steht. Hier einmal der Code. Den Code kann man grundsätzlich in drei Teile aufgliedern. Oben ist der individuelle Teil. Also der selbst geschriebene Code. Die Funktion CStatus soll die Variable "n", den Filenamen, übernehmen und die Inodenummer returnieren. Dazu wird die Klasse sys/stat.h geladen. int Zunächst muss die Python_API geladen werden. Die erste Zeile ist eine Makro, dass immer vor der eigentlichen API geladen werden muss. #define PY_SSIZE_T_CLEAN Als Nächstes laden wir mit einer C-Funktion unseren Input. Dazu wird die Funktion "stat_num" definiert. Zu beachten ist die Definition der Variablen "n" und dem Retournieren unserer Funktion CStatus mit der Variablen n als Input. Hier übergeben wir dem C-Code unsere Variable "n" und geben die Inodenummer an Python zurück. Dabei ist dieses Statement zu beachten, dass "NULL" zurückgegeben wird, wenn ein Fehler auftritt, sonst wird das Argument in den lokalen Wert "n" kopiert. "s" ist dabei ein String, also unser Input-Typwert. if (!PyArg_ParseTuple(args, "s", &command)) Als Ergänzung kann auch kein Rückgabewert weitergeleitet werden. Man kann dann seine Funktionen direkt im C-Code ausführen lassen. Dazu wird die Zeile "Py_RETURN_NONE" verwendet. static PyObject * Der nächste Teil ist eine Methodentable-Definition in der die Funktion "stat_num" registriert wird. static PyMethodDef stat_methods[] = { Die Methodentable wird nun in der Methoden-Definition registriert. static struct PyModuleDef status = Diese Struktur wird nun an den Interpreter übergeben. PyMODINIT_FUNC PyInit_status(void) { Damit hätten wir eine C-Funktion, die wir kompilieren können, und von Python verwendet werden kann. Nähere Informationen dazu sind in der offiziellen Dokumentation zu finden. Python 3 Dokumention zur externen Modulen Um jetzt eine einfache Möglichkeit zum Kompilieren zu verwenden, eignet es sich ein Paket (Wheel) daraus zu bauen. Dazu habe ich einen Artikel geschrieben, der sich auch genau auf Pakete mit C-Modulen bezieht. Pakete erstellen und installieren 2. Parameterübergabe von zwei String-Werten Dazu erweitern wir den selbstgeschrieben Code und die Python-Funktion um die entsprechenden Defintionen. Hier wird eine weitere Variable "k" definiert. Und zum Unterschied zum vorherigen Beispiel wird direkt im C-Code die Variable verwendet und kein Rückgabewert weitergegeben. An zwei Stellen ist ein Prinf-Statement, dass die Variable anzeigt, direkt im C-Code. int Um den Code nun auszuführen hier eine Beispiel. Python 3.11.0rc2 (main, Sep 13 2022, 00:00:00) [GCC 12.2.1 20220819 (Red Hat 12.2.1-1)] on linux 3. Parameterübergabe von einem Integer-Wert In diesem Beispiel wird ein Integerwert übergeben und auch retourniert. Es wird ein Wert der Fibonacci-Reihe berechnet und zurückgegeben. #define PY_SSIZE_T_CLEAN Ein Unterschied besteht in den Funktionen CFibonacci und fib_num, in denen statt eines Char/String-Wert nun ein Integerwert/(Long Long) definiert werden muss. Hier ein Beispiel zur Anwendung. Python 3.11.0rc2 (main, Sep 13 2022, 00:00:00) [GCC 12.2.1 20220819 (Red Hat 12.2.1-1)] on linux Weitere Quellen und Suchbegriffe: Python, C-Module, Python-Module geändert, 18. Nov 2022, 23:52 Copyright © 2025 by Philipp |