Я статически объявил большую структуру в C, но мне нужно использовать эти же данные для некоторого анализа в Python.Я бы не стал повторно копировать эти данные в Python, чтобы избежать ошибок. Есть ли способ получить доступ (только для чтения) к этим данным непосредственно в Python?Я посмотрел на "ctypes" и SWIG, и ни один из них, кажется, не обеспечивает то, что я ищу ....
Например, у меня есть:
/ *.h file * /
typedef struct
{
double data[10];
} NestedStruct;
typedef struct
{
NestedStruct array[10];
} MyStruct;
/ * .c file * /
MyStruct the_data_i_want =
{
{0},
{
{1,2,3,4}
},
{0},
};
В идеале я хотел бы что-то, что позволило бы мнечтобы получить это в Python и получить доступ к нему через the_data_i_want.array[1].data[2]
или что-то подобное.Какие-нибудь мысли?Я получил возможность «работать» в том смысле, что мне удалось скомпилировать / импортировать .so, созданный из моего файла .c, но я не смог получить к нему доступ через cvars.Может есть другой способ?Кажется, это не должно быть так сложно ...
На самом деле, я понял это.Я добавляю это, потому что моя репутация не позволяет мне отвечать на мой собственный вопрос в течение 8 часов, и так как я не хочу запоминать через 8 часов, я добавлю это сейчас.Я уверен, что для этого есть веская причина, которую я не понимаю.
Понял.
1-й Я скомпилировал мой файл .c в библиотеку:
Затем я использовал типы для определения класса Python, который будет содержать данные:
from ctypes import *
class NestedStruct(Structure):
_fields_ = [("data", c_double*10)]
class MyStruct(Structure):
_fields_ = [("array", NestedStruct*10)]
Затем я загрузил общую библиотеку в python:
my_lib = cdll.LoadLibrary("my_lib.so")
Затем я использовал "in_dll "метод для получения данных:
the_data_i_want = MyStruct.in_dll(my_lib, "the_data_i_want")
Тогда я мог бы получить к нему доступ, как если бы это было C. the_data_i_want.array[1].data[2]
Примечание. Возможно, здесь немного ошибся синтаксис, потому что мойФактическая структура данных вложена в 3 уровня, и я хотел упростить ее для иллюстрации.