Ich versuche, ein .so-Bibliothekswrapper für ein vorhandenes C-Quellcode-Projekt zu schreiben und dann die Funktionen in der .so-Bibliothek von Python aus aufzurufen. Ich konnte Funktionen mit primitiven Argumenten aufrufen und Typen ohne Probleme zurückgeben, daher arbeite ich jetzt an komplexeren Funktionen mit Argumenten, die Zeiger auf Strukturen sind.Abrufen von Strukturen aus .so-Dateien in Python
Mein Problem besteht darin, die Strukturen auf der Python-Seite zu erstellen, so dass ich die C-Bibliothek-Funktionen aufrufen kann. Einige der Strukturen in der .so Bibliothek haben Hunderte von Feldern, so dass ich hoffte, dass es eine einfachere Alternative zum Schreiben aller Felder und Typen in einem Python ctypes Structure
Objekt gibt.
Ich möchte in der Lage sein, so etwas zu schreiben, ist Python:
from ctypes import *
lib = cdll.LoadLibrary("./libexample.so")
class Input(Structure):
_fields_ = lib.example_struct._fields ## where `example_struct` is defined in the .so library
## I have no idea if you can actually get the fields of the struct!!
my_input = Input(a,b,c,...) ## pseudo-code
my_ptr = pointer(my_input) ## wrap the input with a pointer
result = lib.my_lib_func(my_ptr) ## call .so function with struct
Dies würde erlauben Sie mich zumindest die Strukturdefinitionen des großen C structs leicht zu replizieren, ohne langen Python erstellen zu müssen und pflegen Versionen der Strukturdefinitionen. Ist das möglich? Oder gibt es einen anderen Weg, denselben Effekt zu erzielen?
EDIT: Der C-Quellcode ist Third Party, so für jetzt, suche ich nach einem Ansatz, wo ich die C-Quelle nicht ändern muss.
* "Strukturen [...] haben Hunderte von Feldern" * Das ist normalerweise ein Hinweis auf einen Konstruktionsfehler. Es kann sinnvoller sein, Arrays zu verwenden. – user3386109
Könnte sein, aber es ist nicht mein Code, also versuche ich es möglichst nicht-invasiv zu verpacken. – gariepy
@ user3386109: Es gibt sehr gut solche 'structs'. Aber sie sind selten und für neuen Code ist ein OOP-Ansatz mit Vererbung oft besser. – Olaf