我想用Cython访问的一些标准C库有很多标志。 Cython文档声明我必须复制我需要的标题部分。在功能定义方面哪个很好。它们通常在任何地方都被复制,包括文档。但那些神奇的数字呢?
如果我想调用mmap
,我总能找到函数定义并将其粘贴到.pxd文件中:
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
但是调用它需要大量的标记,例如PROT_READ
,MAP_ANONYMOUS
等等。我至少有两个问题:
首先,仔细查找这些数字的定义是令人讨厌的工作。实际上我宁愿写一个.c文件并打印我需要的值。有没有更好的方法来查找给定标志的值,例如PROT_READ
?
其次,这些数字有多稳定?提取了我需要的所有值并将它们硬编码到我的Cython源代码中,在不同平台上编译的可能性有哪些转换,让我们说PROT_READ
和PROT_EXEC
?
即使答案是没有好的或正确的方法,我也想听听。只要我知道我没有遗漏某些东西,我总能接受一些繁琐的东西。
答案 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)
有几种可能的选择:
mmap
模块中的标志。
mmap
对象,然后将其交给您的Cython代码
ctypeslib
的代码生成器
话虽如此,数字非常非常稳定。如果它们发生了变化,则必须重新编译使用mmap的每个C程序,因为标题中的标志包含在二进制文件中。
编辑:mmap
是part 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文件
显然,如果你愿意,你可以为多个包含做到这一点。
生成的文件可能需要一些清理,但它会让你关闭。