【问题标题】:using c structures from a shared library with ctypes in Python在 Python 中使用带有 ctypes 的共享库中的 c 结构
【发布时间】:2015-07-19 14:44:09
【问题描述】:

我做了很多研究,但没有任何结果...我是 Python 和 Ctypes 的新手,我正在尝试从共享库中调用函数。到目前为止一切都很好,但是这些函数将 .so 中定义的结构中的数据类型作为参数细节

我的问题是,我已经看到了如何在 Python 中声明“类结构”的示例,但这就是我在 .so 中的内容

typedef struct noPDDE
{
     void *x;
     struct noPDDE *y;
     struct noPDDE *z;
}NoPDDE,*pNoPDDE;

typedef struct PDDE
{
    int tam;
    pNoPDDE sup;
}PDDE;

我不知道如何将 PDDE 指针传递给函数。

任何帮助都是有用的。非常感谢。

【问题讨论】:

  • PDDE 是一个结构,而不是一个指针。您的意思是“将指针传递给 PDDE 结构”吗?

标签: python c data-structures ctypes


【解决方案1】:

这是在 ctypes 中声明递归结构的方式:

 from ctypes import (
     Structure,
     c_void_p,
     POINTER,
     c_int,
     byref,
 )


 class noPDDE(Structure):
     pass

 noPDDE._fields_ = [
     ("x", c_void_p),
     ("y", POINTER(noPDDE)),
     ("z", POINTER(noPDDE)),
     ]


 class PDDE(Structure):
     _fields_ = [
         ("tam", c_int),
         ("sup", POINTER(noPDDE)),
         ]



 foo = PDDE()

 mylib.func_that_takes_pointer_to_pdde(byref(foo))

【讨论】:

  • 我完全按照你写的做,但这里仍然缺少一些东西。第一个错误是 "cannot import void_p" ,所以我使用了 ("x", c_void_p)。行。现在,它告诉我 PDDE 类中 fields 上的第二个元素必须是 c 类型...
  • 我犯了一个错误,因为我显然无法运行你的代码,因为缺少你那个奇怪的库,并更正了它。但是您需要自己弄清楚类似的事情,错误消息非常清楚,并且 ctypes-Structure 的文档也是如此。
  • 好的,非常感谢@deets!我不知道如何声明递归结构。
  • 我已经做了@deets,但我刚刚创建了我的帐户,我想我没有足够的声誉:/
  • @eryksun drat。你是对的。我确实创建了一个没有调用的简单示例,因为我可能无法进行真正的 c 调用。但我应该检查一下 pylint。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2012-07-02
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多