gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:11:22 25 4
gpt4 key购买 nike

我已经在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com