访问C头魔术数/标志与Cython
-
18-09-2019 - |
题
一些标准C库,我想访问与Cython有一吨的标志。该Cython docs状态,我必须重复部分的头我需要的。这是很好的时候功能的定义。他们通常是复制的无处不在,文件包括在内。但怎么样所有那些神奇的号码?
如果我想要呼叫 mmap
, 我总是可以找到的功能定义和粘贴到一个.pxd文件:
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
但是叫它需要一吨的标志喜欢 PROT_READ
, MAP_ANONYMOUS
等等。我有至少两个问题:
首先,它是令人讨厌的工作,以追捕正是这些数字被定义。事实上,我宁可写。c文件和printf的价值观我的需要。是否有任何好的方式找到的价值定标志,例如 PROT_READ
?
第二,如何稳定是这些数字?具有提取的所有价值观,我需要和硬编码他们到我的Cython源,哪些机会,汇编在一个不同的平台具有交换,让我们说 PROT_READ
和 PROT_EXEC
?
甚至如果答案是没有好的或适当的方式来做到这一点,我想要听到它。我总是可以接受的东西是麻烦只要我知道我不会错过的东西。
解决方案
使用这些常量从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,这个做工精细。
其他提示
写一个文件foo。c这样的内容:
#include <sys/mman.h>
然后运行
cpp -dM foo.c | grep -v __ | awk '{if ($3) print $2, "=", $3}' > mman.py
这将创造一个python文件,该文件定义的所有常量从mman.h
很显然,你可以做到这一点为多包括如果你想要的。
生成的文件可能需要一点点的清理,但它会让你接近。
不隶属于 StackOverflow