Probleme bei der Verwendung von C-Code in Python | Set 1
Voraussetzung: Verwenden von C-Codes in Python | Set 1 , Set 2
Problem Nr. 1: Wenn Sie ctypes verwenden, besteht das Problem, dass der ursprüngliche C-Code möglicherweise eine Sprache verwendet, die Python nicht sauber zugeordnet ist.
Nehmen wir das Beispiel einer divide()
Funktion, die über eines ihrer Argumente einen Wert zurückgibt. Es ist eine übliche C-Technik, aber es ist oft nicht klar, wie sie in Python funktionieren soll.
divide
=
_mod.divide
divide.argtypes
=
(ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int))
x
=
0
divide(
10
,
3
, x)
Ausgabe :
Traceback (letzter Anruf zuletzt): Datei "", Zeile 1, in ctypes.ArgumentError: Argument 3 :: erwartet LP_c_int Instanz statt int
Problem Nr. 2:
Auch wenn es funktioniert, liegt ein Verstoß gegen Pythons Unveränderlichkeit von ganzen Zahlen vor. Für Argumente mit Zeigern muss ein kompatibles ctypes- Objekt erstellt werden, das wie im folgenden Code übergeben wird.
x
=
ctypes.c_int()
(
"divide(10, 3, x) : "
, divide(
10
,
3
, x))
(
"x.value : "
, x.value)
Ausgabe :
Teilen (10, 3, x): 3 x.Wert: 1
Problem Nr. 3:
Im folgenden Code wird eine Instanz einer ctypes.c_int erstellt und übergeben, da das Zeigerobjekt .c_int- Objekt im Gegensatz zu einer normalen Python-Ganzzahl mutiert werden kann. Um den Wert entweder abzurufen oder zu ändern, kann das Attribut .value verwendet werden.
_divide
=
_mod.divide
_divide.argtypes
=
(ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int))
_divide.restype
=
ctypes.c_int
def
divide(x, y):
rem
=
ctypes.c_int()
quot
=
_divide(x, y, rem)
return
quot, rem.value
Problem Nr. 4: Die avg()
Funktion ist eine Herausforderung.
Der zugrunde liegende C-Code erwartet eine Länge, die ein Array darstellt, und empfängt einen Zeiger. In der Praxis kann ein Python-Array in der Praxis jedoch viele verschiedene Formen annehmen. Es kann sich um ein Array, eine Liste, ein Tupel oder ein Numpy-Array handeln, und Sie möchten möglicherweise mehrere Möglichkeiten unterstützen.