从Python访问C声明的嵌套结构

时间:2012-03-08 21:58:37

标签: python c swig ctypes

我在C中静态声明了一个大型结构,但我需要使用相同的数据在Python中进行一些分析。我宁愿不将这些数据重新复制到Python中以避免错误,有没有办法直接在Python中访问(只读)这些数据?我看过“ctypes”和SWIG,他们似乎都没有提供我正在寻找的东西......

例如我有:

/ * .h文件* /

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]或类似的东西访问它。有什么想法吗?从我能够编译/导入从我的.c文件创建的.so这个意义上来说,我已经开始“工作”,但我无法通过cvars访问任何一个.so文件。也许有另一种方式?看起来这应该不那么难......


实际上,我想通了。我添加这个是因为我的声誉不允许我在8小时内回答我自己的问题,因为我不想在8小时内记住,我现在就加上它。我确信有一个很好的理由,我不明白。

想出来。

第一次我将.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 个答案:

答案 0 :(得分:1)

您也可以在C中读取数据并写入JSON文件,然后您可以轻松解析(通常会有一个库,甚至会为您执行此操作; python {{1}几乎所有你能想到的语言设置都可以访问任何不同的平台。同时,与您在原始C代码中访问数据的方式相比,您可以非常相似地访问您的数据。

就像一个建议。这会让你的数据更加便携和通用我认为,但是你会花更多的时间来编写和解析JSON,就像你直接从你那里读取数据流一样C代码进入python。