Angenommen, ich die folgende Funktion in einer externen Bibliothek habe:Ist es möglich, sowohl Bytes als auch Bytearray-Objekte mit ctypes effizient an eine externe Bibliothek zu übergeben?
void foo(const unsigned char *buf, const int len);
ich diese Funktion nutzen können anrufen möchte von meinem Python-Code, ctypes
verwenden, ohne eine Kopie des Puffers zu machen. Der Puffer könnte ziemlich groß sein, so dass das Vermeiden einer Kopie offensichtliche Leistungsvorteile hat. Und für den Komfort des Verbrauchers meines Codes würde ich gerne in der Lage sein, diesen Puffer entweder als bytes
oder bytearray
zu liefern.
Im Moment erkläre ich buf
als ctypes.POINTER(ctypes.c_char)
in meiner argtypes
Deklaration.
lib.foo.argtypes = [ctypes.POINTER(ctypes.c_char), ctypes.c_int]
buf = bytes(...)
lib.foo(buf, len(buf))
Dies funktioniert gut, und ich kann ein bytes
Objekt übergeben. Wenn ich jedoch ein bytearray
Objekt übergeben dann begegne ich den folgenden Fehler:
ctypes.ArgumentError: argument 1: : wrong type
Gibt es für mich einen Weg zu ermöglichen bytearray
vorzugsweise mit bytes
austauschbar übergeben, werden?
@eryksun Danke für die Antwort. Ich habe keine wirklichen Sorgen darüber, wie dies erreicht wird. Ich möchte nur, dass der externe Code ein 'const unsigned char * 'erhält, ohne den Inhalt des Puffers zu kopieren. Wenn möglich. –