Доступ к C-объявленной вложенной структуре из Python - PullRequest
8 голосов
/ 09 марта 2012

Я статически объявил большую структуру в 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 уровня, и я хотел упростить ее для иллюстрации.

1 Ответ

1 голос
/ 05 марта 2015

Вы также могли бы в C прочитать данные и записать их в JSON-файл, который затем можно легко проанализировать (обычно есть библиотека, которая даже сделает это за вас; python import json) и получить доступ к любой другой форме. Платформа с почти каждой языковой настройкой, о которой вы могли подумать. И в то же время вы могли бы получить доступ к своим данным, очень похожим по сравнению с тем, как вы обращались к ним в исходном коде C.

Так же, как предложение. Я думаю, это сделает ваши данные более портативными и универсальными, но вы будете тратить больше времени на написание и анализ JSON, как если бы вы просто читали поток данных непосредственно из вашего кода C в python.

...