2010-02-05 19 views
4

我想用Cython訪問的一些標準C庫有很多標誌。 Cython文檔聲明我必須複製我需要的標題部分。當涉及到函數定義時,這很好。他們通常在任何地方複製,包括文檔。但那些神奇的數字呢?使用Cython訪問C頭幻數/標誌

如果我要打電話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_READPROT_EXEC

即使答案是沒有好的或正確的方法來做到這一點,我想聽聽它。我總是可以接受的是,只要我知道我不會錯過任何東西,就會感到麻煩。

回答

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

有幾種可能的選擇:

  1. 從Python mmap模塊使用標誌。
    • 簡單
    • 只有當有現有的Python綁定
  2. 作品使用在首位的Python mmap對象,並把它交給你用Cython代碼
    • 更簡單openening
    • 可能有一些Python開銷
  3. 使用的ctypeslib
    • some docs如何提取常數代碼生成
    • 需求gccxml
  4. 僅複製的號碼。

這就是說,數字非常非常穩定。如果他們改變了,使用mmap的每個C程序將不得不重新編譯,因爲標題中的標誌包含在二進制文件中。

編輯mmappart of POSIX,但粗略讀並未透露是否標誌必須在所有平臺上相同的值。

+1

可移植性的情況很糟糕:有些值由POSIX定義,有些則不是。 POSIX的版本幾乎是固定的,其他版本可能因平臺而異。 – 2010-02-05 11:53:45

1

寫一個文件foo。c。與本作的內容:

#include <sys/mman.h> 

然後運行

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

這將創建一個定義所有從mman.h常量

顯然Python文件,你可以做多包括如果你想要的。

生成的文件可能需要一些清理,但它會讓你關閉。