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

por*_*uod 4 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)
Run Code Online (Sandbox Code Playgroud)

但是召唤它需要大量的旗帜PROT_READ,MAP_ANONYMOUS等等.我至少有两个问题:

首先,确切地追捕这些数字的位置是令人讨厌的工作.实际上我宁愿写一个.c文件并打印我需要的值.有没有更好的方法来找到给定旗帜的价值,如PROT_READ

其次,这些数字有多稳定?已经提取我所需要的所有值和硬编码他们到我用Cython源,什么是编译在不同的平台的周围切换的机会,让我们说PROT_READPROT_EXEC

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

小智 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
    ...
Run Code Online (Sandbox Code Playgroud)

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