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

标签 python c swig ctypes

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


其实,我想通了。我添加这个是因为我的声誉不允许我在 8 小时内回答我自己的问题,并且因为我不想在 8 小时内记住我现在将添加它。我敢肯定这是有充分理由的,但我不明白。

想通了。

1st 我将我的 .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 层,为了便于说明,我想在这里进行简化。

最佳答案

你也可以在 C 中读取数据并将其写入 JSON 文件,然后你可以轻松地解析它(通常有一个库甚至可以为你做这件事;python import json ) 并使用几乎所有您能想到的语言设置从任何不同的平台访问。同时,与在原始 C 代码中访问数据的方式相比,您可以访问非常相似的数据。

只是一个建议。我认为这将使您的数据也更具可移植性和通用性,但您将花费更多时间编写和解析 JSON,就好像您只是将数据流直接从 C 代码读取到 python 中一样。

关于python - 从 Python 访问 C 声明的嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9625665/

相关文章:

Python 2.4 - 单元测试 : TypeError: run() takes exactly 2 arguments (1 given)

java - fortran/c/python 和 speed 中的长函数名称

python - 在 Python 中,如何访问由 SWIG 包装的 uint16[3] 数组(即打开 PySwigObject)?

java - 使用 SWIG 将 char * 类型结构的成员转换为 Java 中的 java.lang.Object

c - 如何在 GO 中将 "_Ctype_int"更改为 "int"?

python - 从饼图中删除标签会移动图例框

python - 当 pickle 一个类时,我在 python 中得到了与在 cython 中不同的行为

c - 一个简单的 C XML 解析器

python - return 语句返回 None 而不是 value

c - 如何将指针转换为整数,反之亦然?