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

8
我已经在C语言中静态声明了一个大型结构体,但我需要使用相同的数据在Python中进行一些分析。我不想重新复制这些数据到Python中,以避免错误,有没有一种方法可以直接在Python中访问(只读)这些数据?我已经查看了“ctypes”和SWIG,但它们似乎都没有提供我所需的功能...
例如,我有:
/* .h文件 */
typedef struct
{
  double data[10];
} NestedStruct;


typedef struct
{
   NestedStruct array[10];
} MyStruct;

/* .c文件 */

MyStruct the_data_i_want = 
{
  {0},
  {
   {1,2,3,4}
  },
  {0},
};

理想情况下,我希望有一个东西让我能够将其转换为 Python 并通过 the_data_i_want.array[1].data[2] 或类似的方式访问它。有什么想法吗?我成功地使用 swig 编译/导入了从我的 .c 文件创建的 .so 文件,但我无法通过 cvars 访问其中的任何内容。也许还有其他方法?这似乎不应该那么难...
实际上,我已经搞定了。我添加这个是因为我的声誉不允许我在 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层,而我想简化说明。


对于 SWIG,您可能会对 https://dev59.com/yV3Ua4cB1Zd3GeqP-DDM 感兴趣。 - Flexo
2
也许现在是将解决方案迁移到实际答案并接受它的好时机。 - augurar
1个回答

1
你也可以在C语言中读取数据并将其写入JSON文件,然后轻松解析它(通常有一个库可以做到这一点;python import json),并从任何不同平台使用几乎所有编程语言访问。与在C代码中访问数据的方式相似,同时使数据更加便携和多功能。但这样做需要更多时间来编写和解析JSON文件,如果你直接从C代码流中读取数据到Python,则可以节省时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接