一些标准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_READPROT_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,这个做工精细。

其他提示

有几种可能的备选方案:

  1. 使用该标志的蟒蛇 mmap 模块。
    • 简单的
    • 只有当现有的蟒蛇绑定的
  2. 使用的蟒蛇 mmap 目在第一位,并且把它交给你的Cython码
    • 甚至更简单的开封
    • 可能会有一些蟒蛇的开销
  3. 使用代码生成的 ctypeslib
  4. 只是复制的数字。

这就是说,数字是非常,非常稳定。如果他们想改变,每一C节目使用mmap会重新编译,作为标志,从标题中包含二进制的。

编辑: mmap部分POSIX, 但一个粗略的读没有透露是否标志必须是相同的价值在所有的平台。

写一个文件foo。c这样的内容:

#include <sys/mman.h>

然后运行

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

这将创造一个python文件,该文件定义的所有常量从mman.h

很显然,你可以做到这一点为多包括如果你想要的。

生成的文件可能需要一点点的清理,但它会让你接近。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top