Wie verwende ich ctypes auf eine Python Callback-Funktion einer Bibliothek extern Funktionszeiger zu setzen?

StackOverflow https://stackoverflow.com/questions/492377

  •  20-08-2019
  •  | 
  •  

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;
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top