2016-03-28 5 views
0

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.

+0

* "Strukturen [...] haben Hunderte von Feldern" * Das ist normalerweise ein Hinweis auf einen Konstruktionsfehler. Es kann sinnvoller sein, Arrays zu verwenden. – user3386109

+0

Könnte sein, aber es ist nicht mein Code, also versuche ich es möglichst nicht-invasiv zu verpacken. – gariepy

+0

@ 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

Antwort

0

Der Cython-Ansatz besteht darin, die Headerdatei .h zu lesen und zu interpretieren. Aber ich sage nicht, es wäre einfach.