使用Cython访问C头魔术数字/标志

时间:2010-02-05 10:40:28

标签: python header-files cython

我想用Cython访问的一些标准C库有很多标志。 Cython文档声明我必须复制我需要的标题部分。在功能定义方面哪个很好。它们通常在任何地方都被复制,包括文档。但那些神奇的数字呢?

如果我想调用mmap,我总能找到函数定义并将其粘贴到.pxd文件中:

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)

但是调用它需要大量的标记,例如PROT_READMAP_ANONYMOUS等等。我至少有两个问题:

首先,仔细查找这些数字的定义是令人讨厌的工作。实际上我宁愿写一个.c文件并打印我需要的值。有没有更好的方法来查找给定标志的值,例如PROT_READ

其次,这些数字有多稳定?提取了我需要的所有值并将它们硬编码到我的Cython源代码中,在不同平台上编译的可能性有哪些转换,让我们说PROT_READPROT_EXEC

即使答案是没有好的或正确的方法,我也想听听。只要我知道我没有遗漏某些东西,我总能接受一些繁琐的东西。

3 个答案:

答案 0 :(得分:6)

要使用Cython中的这些常量,您不需要确切地确定它们来自何处或它们是什么,而不是从C中。例如,您的.pxd文件可能看起来像

cdef extern from "foo.h":
    void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
    cdef int PROT_READ
    cdef int MAP_ANONYMOUS
    ...

只要定义(直接或间接)包含在foo.h中,这应该可以正常工作。

答案 1 :(得分:2)

有几种可能的选择:

  1. 使用Python mmap模块中的标志。
    • 简单
    • 仅在存在Python绑定时才有效
  2. 首先使用Python mmap对象,然后将其交给您的Cython代码
    • 甚至更简单的开放
    • 可能有一些Python开销
  3. 使用ctypeslib的代码生成器
    • some docs关于如何提取常量
    • 需要gccxml
  4. 只需复制数字。
  5. 话虽如此,数字非常非常稳定。如果它们发生了变化,则必须重新编译使用mmap的每个C程序,因为标题中的标志包含在二进制文件中。

    编辑mmappart of POSIX,但粗略读取并未显示所有平台上的标记是否必须相同。

答案 2 :(得分:1)

使用以下内容编写文件foo.c:

#include <sys/mman.h>

然后运行

cpp -dM foo.c | grep -v __ | awk '{if ($3) print $2, "=", $3}' > mman.py

将创建一个定义mman.h中所有常量的python文件

显然,如果你愿意,你可以为多个包含做到这一点。

生成的文件可能需要一些清理,但它会让你关闭。