使用Cython访问C头幻数/标志

2024-06-16 17:30:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用Cython访问的一些标准C库有大量的标志。Cython文档声明我必须复制我需要的头部分。当涉及到函数定义时,这是很好的。它们通常被复制到任何地方,包括文档。但是那些神奇的数字呢?在

如果我想调用mmap,我总能找到函数定义并将其粘贴到.pxd文件中:

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)

但是调用它需要大量的标志,比如PROT_READMAP_ANONYMOUS等等。我至少有两个问题:

首先,寻找这些数字的确切定义是一项烦人的工作。事实上,我宁愿编写一个.c文件并打印我需要的值。有没有更好的方法来查找给定标志的值,比如PROT_READ?在

第二,这些数字有多稳定?在提取了我需要的所有值并将它们硬编码到Cython源代码之后,在不同平台上编译的机会有多大,比如PROT_READ和{}?在

即使答案是没有好的或适当的方法去做,我还是想听听。只要我知道我没有错过什么,我总是可以接受有些事情是很麻烦的。在


Tags: 文件方法函数文档声明read标准定义
3条回答

有几种可能的选择:

  1. 使用Python^{}模块中的标志。
    • 简单
    • Python绑定只有在存在绑定时才起作用
  2. 首先使用Pythonmmap对象,然后将其交给Cython代码
    • 更简单的开场白
    • 可能会有一些Python开销
  3. 使用^{}的代码生成器
    • some docs关于如何提取常量
    • 需要gccxml
  4. 把号码抄下来。在

也就是说,这些数字非常非常稳定。如果它们改变了,每个使用mmap的C程序都必须重新编译,因为头中的标志包含在二进制文件中。在

EDITmmappart of POSIX,但是粗略阅读并没有揭示在所有平台上标志是否必须是相同的值。在

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

#include <sys/mman.h>

那就跑吧

^{pr2}$

它将创建一个python文件来定义mman.h中的所有常量

显然,如果需要,可以对多个include执行此操作。在

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

要使用Cython中的这些常量,您不必像从C语言中那样精确地计算它们来自何处或它们是什么

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中,就可以正常工作。在

相关问题 更多 >