2015-04-06 97 views
3

我正在爲我們正在維護的C庫編寫一個Cython包裝器。我收到以下錯誤消息: 從Cython傳遞C函數的原始指針

analog.pyx:6:66: Cannot convert 'unsigned short (*)' to Python object 

這裏是我想要寫代碼:

cimport company as lib 

def get_value(device, channel, index): 
    cdef unsigned short aValue 

    err = library_get_data_val(device, channel, index, &aValue) # line 6 

    # Ignore the err return value for StackOverflow. 

    return aValue 

C函數我想使用的原型是:

unsigned long library_get_data_val(unsigned long device, int channel, 
    int index, unsigned short *pValue); 

庫函數返回aValue參數中的請求值。這只是一個unsigned short原語。從這些類型的函數返回原語(即不是struct)的預期方式是什麼?我對Cython是新手,所以答案可能很簡單,但我沒有看到任何明顯的谷歌。

回答

0

我發現我的問題是什麼。你可以告訴我現在是什麼編輯了這個問題。有一個company.pxd文件,cimport.pyx文件編輯。一旦我將C原型複製到company.pxd中就行了。

我還需要使用lib前綴在我的電話:

err = lib.library_get_data_val(device, channel, index, &aValue) # line 6 
0

我認爲問題是,你還沒有定義library_get_data_val正常,所以用Cython認爲這是你調用一個Python類型的功能,不知道做什麼用指針做aValue

嘗試:

cdef extern from "header_containing_library_get_data_val.h": 
    # I've taken a guess at the signature of library_get_data_val 
    # Update it to match reality 
    int library_get_data_val(int device, int channel, int index, int* value) 

這樣,Cython知道它是一個C函數,它需要一個指針,並且會很高興。

(編輯從我原來的答覆,在那裏我誤解了問題被顯著改變!)