2016-03-28 2 views
0

Я пытаюсь написать обертку библиотеки .so для существующего проекта исходного кода C, а затем вызывать функции в .so-библиотеке из Python. Мне удалось вызвать функции с примитивными аргументами и возвращать типы без проблем, поэтому теперь я работаю над взаимодействием с более сложными функциями, у которых есть аргументы, являющиеся указателями на структуры.Извлечение структур из .so-файлов в Python

Моя проблема заключается в создании структур на стороне Python, чтобы я мог вызвать функции C-библиотеки. Некоторые из структур в .so-библиотеке имеют сотни полей, поэтому я надеялся, что существует более простая альтернатива описанию всех полей и типов в объектах Python ctypes Structure.

Я хотел бы быть в состоянии написать что-то вроде этого является 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 

Это позволит мне легко воспроизвести, по крайней мере определение структуры крупных структур C, без необходимости создавать и поддерживать длительный Python версии структурных определений. Это возможно? Или есть другой способ добиться такого же эффекта?

EDIT: исходный код C является третьим лицом, поэтому на данный момент я ищу подход, в котором мне не нужно изменять источник C.

+0

* "structs [...] имеют сотни полей" * Это обычно указывает на недостаток дизайна. Возможно, более целесообразно использовать массивы. – user3386109

+0

Может быть, но это не мой код, поэтому я пытаюсь обернуть его неинвазивным способом, если это возможно. – gariepy

+0

@ user3386109: Есть очень хорошо такие 'structs'. Но они редки и для нового кода, некоторый подход ООП с наследованием часто лучше. – Olaf

ответ

0

Подход Cython заключается в том, чтобы читать и интерпретировать файл заголовка .h. Но я не говорю, что это будет легко.

Смежные вопросы