4

我正在使用定义不透明类型的第 3 方 C 库:

    foo_t

并在其函数中使用指向此类型的指针:

    void foo_init(foo_t *foo);

典型用法是在堆栈上分配一个 foo_t 并传递一个引用:

  {
    foo_t foo;

    foo_init(&foo);
    ...
  }

如何在foo_init()不知道什么构成 a 的情况下使用 ctypes调用foo_t

我想如果我知道sizeof(foo_t)我可以创建一个该大小的缓冲区并进行转换,但是是否可以使用 ctypes 获得大小?

我可以编写一个单行 C 程序:

    printf("sizeof(foo_t) = %zu\n", sizeof(foo_t));

并将该值硬编码到我的python中,但这会很快变得难看:每次升级库时,我都必须接触我的python源。

一种更简洁的方法是编写一个 python c-ext 来导出大小值,但这也需要在每次库升级时重新编译。

有没有人有使用这种不透明类型的 ctypes 的秘诀?

4

2 回答 2

3

我认为这是最简单的解决方案...

创建一个 C 文件,例如 foosizes.c:

    size_t SIZEOF_FOO = sizeof(foo_t);

并将其编译为共享对象,foosizes.so. 然后在python脚本中:

    from ctypes import *
    foosizeslib = CDLL('foosizes.so')
    sizeof_foo = c_ulong.in_dll(foosizeslib, 'SIZEOF_FOO')

然后,我可以创建一个适当大小的缓冲区,并通过引用将其作为指向不透明类型的指针传递给函数。到现在为止还挺好。

于 2012-11-15T22:25:35.673 回答
0

由于 C 不支持运行时反射,因此无法使用 ctypes 获取大小,因为没有像 Java 或 C#/.Net 那样将类型的元数据存储在编译后的二进制文件中。

正如您所说,获取大小的一种方法是创建一个简单的 C 程序,其中包含定义类型的标头,然后使用 sizeof 运算符打印出大小。更进一步,您可以利用用 Python 编写的 C 编译器来编译和执行您的 C 代码,以获取执行 Python 代码时的大小。您甚至可以通过遍历编译器提供的数据结构来获得它,而无需实际执行结果。

也就是说,您确定需要自己创建内存吗?C 库经常提供一种方法来创建其其他函数操作的不透明类型。 更新:从评论中可以确定内存必须由调用者分配。

于 2012-11-15T18:37:40.823 回答