使用ctypes从Python中使用C函数返回的结构访问数据

时间:2017-08-25 14:13:55

标签: c python-3.x ctypes

我知道这个问题已经得到了处理,但是我找不到任何对我有用的东西,所以我猜我的问题与其他问题略有不同。

我所做的基本上是使用ctypes将C函数包装到python代码中。 我的目标是在C函数中计算一些数量,将它们存储到一个结构中,然后在Python中返回结构,在那里我可以读取结构中的所有不同数据。

所以:

要在python中定义我的结构,我使用:

class BITE(ctypes.Structure):
    _fields_ = [
                ("lum", ctypes.c_int),
                ("suce", ctypes.c_int)
                ]

我这样编译:

sub.call(["gcc","-shared","-Wl,-install_name,ex.so","-o","ex.so","-fPIC","ex.c"])


lum = ctypes.CDLL('ex.so')
lum = lum.lum

我声明参数和结果类型如下:

lum.restype = ctypes.POINTER(BITE)
lum.argtypes = [ctypes.POINTER(ctypes.c_float),ctypes.c_int,ctypes.POINTER(ctypes.c_float),ctypes.c_int,ctypes.POINTER(ctypes.c_float),ctypes.POINTER(ctypes.c_float),ctypes.c_int,ctypes.POINTER(ctypes.c_float),ctypes.c_int,ctypes.POINTER(ctypes.c_float),ctypes.POINTER(ctypes.c_float),ctypes.POINTER(ctypes.c_float),ctypes.POINTER(ctypes.c_float),ctypes.c_float,ctypes.c_float,ctypes.c_float,ctypes.c_float,ctypes.c_float]

然后,我打电话给C函数" lum"在python代码中

out = lum(all the different variables needed)

问题从这里开始。我有我的结构,但无法读取存储在每个字段中的数据。

我找到的部分解决方案是:

out = out[0]

然而,在做的时候

print(out.suce)

我有分段错误11.不知道原因。我试图理解如何使用create_string_buffer,但我并不真正理解它是如何工作的以及它应该做什么。此外,我试图用作黑盒子,但仍然无效。

我还尝试了其他线程中提到的一些其他解决方案,例如使用out.contents或类似的东西,但它没有.contents属性。也不是out.suce.value,这也是我在绝望的研究中看到的东西。

当然,我在C代码中检查了结构是否存在以及结构的每个字段是否存在,并且其中包含正确的数据。

感谢。

1 个答案:

答案 0 :(得分:0)

假设您有这样的C结构:

Keyboard.dismiss()

要在ctypes中使用它,你应该创建一个这样的包装器:

typedef struct _servParams
{
   unsigned short m_uServPort;
   char m_pInetAddr[MAX_LENGTH_OF_IP_ADDRESS];
} ServerParams_t;

稍后在python内部,您可以使用以下代码段:

class ServerParams_t(Structure):
        _fields_ = [    ("m_uServPort", c_ushort),
                        ("m_pInetAddr", (c_char * 16)) ]

如果您需要按值传递,只需将servParams = ServerParams_t() servParams.m_uServPort = c_ushort(int(port)) servParams.m_pInetAddr = ip.encode() 变量传递给您。如果您需要传递指针,请使用servParams