Wie verwende ich ctypes auf eine Python Callback-Funktion einer Bibliothek extern Funktionszeiger zu setzen?
Frage
Einige C-Bibliotheken Exportfunktion Zeiger, so dass der Benutzer der Bibliothek setzt diese Funktionszeiger auf die Adresse ihrer eigenen Funktion einen Haken oder Rückruf zu implementieren.
In diesem Beispiel Bibliothek liblibrary.so
, wie ich auf eine Python-Funktion stellte library_hook ctypes mit?
library.h:
typedef int exported_function_t(char**, int);
extern exported_function_t *library_hook;
Lösung
Das ist schwierig in ctypes weil ctypes Funktionszeiger haben die .value
Eigenschaft nicht implementieren verwendet, um andere Zeiger einzustellen. Stattdessen werfen die Callback-Funktion und die extern Funktionszeiger mit der void *
Funktion c_void_p
. Nach den Funktionszeiger als void *
Einstellung wie dargestellt, C Ihre Python-Funktion aufrufen, und Sie können die Funktion als Funktionszeiger abrufen und mit normalen ctypes Anrufe nennen.
from ctypes import *
liblibrary = cdll.LoadLibrary('liblibrary.so')
def py_library_hook(strings, n):
return 0
# First argument to CFUNCTYPE is the return type:
LIBRARY_HOOK_FUNC = CFUNCTYPE(c_int, POINTER(c_char_p), c_int)
hook = LIBRARY_HOOK_FUNC(py_library_Hook)
ptr = c_void_p.in_dll(liblibrary, 'library_hook')
ptr.value = cast(hook, c_void_p).value