ctypes problem: von void* zu ndarray im callback
Verfasst: Freitag 13. Februar 2009, 15:15
Hallo Experten,
ich blicke auch nach einiger Sucherei und Probiererei noch nicht durch. Ich versuch eine existierende C-Bibliothek zu wrappen und wollte dazu ctypes verwenden, da es zu den Standardbibliotheken gehört und rein auf der Python-Seite arbeitet. So weit sind meine Erfahrungen damit auch gut, bloß jetzt bin ich auf ein Problem gestoßen bei dem ich festhänge.
Die Library ruft eine Callback-Funktion auf die ich gern in Python implementieren würde. Die Signatur der Callback-Funktion ist etwas komplizierter, aber der Demonstration halber reicht es, folgende Signatur als Beispiel zu nehmen:
int callback(void *buffer);
buffer ist dabei ein Zeiger auf einen Speicherbereich, der in Wirklichkeit ein zweidimensionales Array aus 32-bit float beinhaltet. Die Array-Größe ist dem Programm bekannt, aber variabel. Auf der Python-Seite hätte ich gern Zugriff auf das Array als ndarray (Numpy). Der Python-Code soll auf dem Array rumrechnen können und die geänderten Daten am Ende des Callbacks auch wieder dem aufrufenden C-Code zur Verfügung stehen. Dabei möchte ich möglicht wenige Datenkopien haben, denn es kann um größere Arrays gehen.
Wie muß die Typdefinition für den Callback in ctypes aussehen, und wie bekomme ich das in ein ndarray konvertiert, so daß auch der Rückweg funktioniert?
Gruß und Danke!
Stefan
ich blicke auch nach einiger Sucherei und Probiererei noch nicht durch. Ich versuch eine existierende C-Bibliothek zu wrappen und wollte dazu ctypes verwenden, da es zu den Standardbibliotheken gehört und rein auf der Python-Seite arbeitet. So weit sind meine Erfahrungen damit auch gut, bloß jetzt bin ich auf ein Problem gestoßen bei dem ich festhänge.
Die Library ruft eine Callback-Funktion auf die ich gern in Python implementieren würde. Die Signatur der Callback-Funktion ist etwas komplizierter, aber der Demonstration halber reicht es, folgende Signatur als Beispiel zu nehmen:
int callback(void *buffer);
buffer ist dabei ein Zeiger auf einen Speicherbereich, der in Wirklichkeit ein zweidimensionales Array aus 32-bit float beinhaltet. Die Array-Größe ist dem Programm bekannt, aber variabel. Auf der Python-Seite hätte ich gern Zugriff auf das Array als ndarray (Numpy). Der Python-Code soll auf dem Array rumrechnen können und die geänderten Daten am Ende des Callbacks auch wieder dem aufrufenden C-Code zur Verfügung stehen. Dabei möchte ich möglicht wenige Datenkopien haben, denn es kann um größere Arrays gehen.
Wie muß die Typdefinition für den Callback in ctypes aussehen, und wie bekomme ich das in ein ndarray konvertiert, so daß auch der Rückweg funktioniert?
Gruß und Danke!
Stefan