Wie verwende ich Ctypes, um den externen Funktionszeiger einer Bibliothek auf eine Python Callback-Funktion zu setzen?

Einige C-Bibliotheken exportieren Funktionszeiger, so dass der Benutzer der Bibliothek diesen Funktionszeiger auf die Adresse ihrer eigenen Funktion setzt, um einen Haken oder einen Rückruf zu implementieren.

In dieser Beispielbibliothek liblibrary.so , wie setze ich library_hook zu einer Python-Funktion mit ctypes?

Library.h:

 typedef int exported_function_t(char**, int); extern exported_function_t *library_hook; 

One Solution collect form web for “Wie verwende ich Ctypes, um den externen Funktionszeiger einer Bibliothek auf eine Python Callback-Funktion zu setzen?”

Dies ist schwierig in ctypes, weil ctypes Funktion Zeiger nicht implementieren die .value Eigenschaft verwendet, um andere Zeiger setzen. Stattdessen werfen Sie Ihre Callback-Funktion und den externen Funktionszeiger auf void * mit der Funktion c_void_p . Nach dem Setzen des Funktionszeigers als void * wie gezeigt, kann C Ihre Python-Funktion aufrufen, und du kannst die Funktion als Funktionszeiger abrufen und mit normalen Centypen anrufen.

 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 
  • Fehler bei der Verwendung von Ctypes-Modul, um eine DLL in C zu schreiben
  • Drucken Sie alle Felder der Ctypen "Struktur" mit Introspektion
  • Unterschiede in den Ctypen zwischen Python 2 und 3
  • Verwenden von Ctypen zum Schreiben von Rückrufen, die Pass-In-Zeiger auf Zeigerparameter, die als Ausgabeparameter verwendet werden sollen
  • Daten aus dem Ctypes-Array in numpy
  • Nachdem die Partition mit IOCTL_DISK_SET_DRIVE_LAYOUT erstellt wurde, wie kann ich in dieser neu erstellten Partition ein neues Volume erstellen?
  • Ctypes und übergeben eine durch Verweis auf eine Funktion
  • Python ctypes: Prototyp mit LPCSTR [out] Parameter
  • Zugriff auf C globale Variablenstruktur durch Python und ctype
  • Python ctypes - dll Funktion akzeptieren Strukturen Abstürze
  • Ändern Sie Windows-Hintergrund aus Python
  • Python ist die beste Programmiersprache der Welt.