Heim >Backend-Entwicklung >Python-Tutorial >Warum gibt meine C-Funktion einen falschen Wert zurück, wenn sie von Python aus mit ctypes aufgerufen wird?
C-Funktion gibt einen falschen Wert zurück, wenn sie von Python über Ctypes aufgerufen wird
Bei dem Versuch, eine C-Funktion von Python aus unter Verwendung von Ctypes aufzurufen, kam es zu einer Nichtübereinstimmung im erwarteten Ergebnis entstand. Die betreffende Funktion erhöhte eine gegebene Zahl auf eine bestimmte Potenz und gab das Ergebnis wie erwartet zurück, wenn sie direkt in C aufgerufen wurde. Beim Aufruf aus Python wurde jedoch ein anderer, falscher Wert erhalten.
Die freigegebene Datei Das Gehäuse der C-Funktion wurde mit dem folgenden Befehl erstellt:
$ gcc -fPIC -shared -o test.so test.c
Nach einigen Permutationen der Konfiguration der C-Funktion wurde in einigen Fällen tatsächlich der erwartete Wert zurückgegeben, was darauf hindeutet, dass das Problem nicht aufgetreten ist aufgrund eines inhärenten Fehlers im C-Code. Insbesondere als die Funktion vereinfacht wurde, um ein einfaches Quadrat zu berechnen (d. h. x*x zurückzugeben, anstatt eine for-Schleife zu verwenden), gab Python das richtige Ergebnis zurück.
Das ultimative Ziel bestand darin, auf ein zweidimensionales C zuzugreifen Array aus Python heraus.
#include <stdio.h> float power(float x, int exponent) { float val = x; for(int i=1; i<exponent; i++){ val = val*x; } return val; }
from ctypes import * so_file = '/Users/.../test.so' functions = CDLL(so_file) functions.power.argtype = [c_float, c_int] functions.power.restype = c_float print(functions.power(5,3))
Beim Aufruf der Funktion aus C wurde die erwartete Ausgabe von 125,0 beobachtet. Allerdings lieferte Python stattdessen einen Wert von 0,0.
Bei weiterer Untersuchung wurde die Diskrepanz auf einen Fehler bei der Angabe der Argumenttypen der C-Funktion in Python zurückgeführt. Anstelle von argtype wurde versehentlich die falsche Schreibweise von argtypes verwendet.
functions.power.argtypes = [c_float, c_int]
Nachdem dieser Tippfehler korrigiert wurde, wurde beim Aufruf der Funktion aus Python erfolgreich der richtige Wert (125,0) zurückgegeben.
Das obige ist der detaillierte Inhalt vonWarum gibt meine C-Funktion einen falschen Wert zurück, wenn sie von Python aus mit ctypes aufgerufen wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!