4

我想用 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_READPROT_EXEC

即使答案是没有好的或适当的方法来做到这一点,我也想听听。只要我知道我没有遗漏任何东西,我总是可以接受有些东西很麻烦。

4

3 回答 3

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 中,这应该可以正常工作。

于 2010-02-06T06:29:59.100 回答
2

有几种可能的选择:

  1. 使用 Pythonmmap模块中的标志。
    • 简单的
    • 仅在存在现有 Python 绑定时才有效
  2. 首先使用 Pythonmmap对象,然后将其交给您的 Cython 代码
    • 更简单的打开方式
    • 可能有一些 Python 开销
  3. 使用代码生成器ctypeslib
    • 一些关于如何提取常量的文档
    • 需要 gccxml
  4. 复制数字就行了。

话虽如此,数字非常非常稳定。如果它们发生变化,则必须重新编译每个使用 mmap 的 C 程序,因为标头中的标志包含在二进制文件中。

编辑mmapPOSIX 的一部分,但粗略的阅读并没有揭示标志是否在所有平台上都必须是相同的值。

于 2010-02-05T10:57:02.597 回答
1

写一个 foo.c 文件,内容如下:

#include <sys/mman.h>

然后运行

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

这将创建一个 python 文件,定义来自 mman.h 的所有常量

显然,您可以根据需要对多个包含执行此操作。

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

于 2010-02-05T11:04:45.197 回答