2016-04-27 37 views
1

我試圖揭露C函數到Python ++函數蟒蛇如下:露出了C++使用用Cython

from libcpp.vector cimport vector 

cdef extern from "auction.h": 
    cpdef double util(
     int q, 
     int sq, 
     double alpha, 
     double beta, 
     double kappa, 
     int s, 
     int ss, 
     int m, 
     const vector[double]& p, 
     double a0); 

我正在以下(不是很描述性的)錯誤:

src\RFQLib.pyx:4:21: Cannot convert 'double (int, int, double, double, double, int, int, int, const vector[double] &, double)' to Python object

這裏有什麼問題?

在此先感謝您的幫助。

+0

您可以嘗試將'p'的類型從'const vector [double]&'更改爲list,tuple或numpy數組,然後在必要時將其轉換爲'const vector [double]&'。 –

回答

0

你得先告訴用Cython有關的功能(通過cdef exetern from機制),然後創建一個用Cython函數調用它,和它的這一點,你可以從Python的使用方法:

from libcpp.vector cimport vector 

cdef extern from "auction.h": 
    double util(
     int q, 
     int sq, 
     double alpha, 
     double beta, 
     double kappa, 
     int s, 
     int ss, 
     int m, 
     const vector[double]& p, 
     double a0); 

def py_util(int q, 
     int sq, 
     double alpha, 
     double beta, 
     double kappa, 
     int s, 
     int ss, 
     int m, 
     p, 
     double a0): 
    cdef vector[double] p_vec = p 
    return util(q,sq,alpha,beta,kappa,s,ss,m,p_vec,a0) 

輕微的併發症是轉換爲C++ vector<double>。 Cython可以自動將包含適當類型的列表/元組轉換爲向量。反面是,這是每次你打電話py_util,所以可能會有點慢。這也是一個問題,如果util存儲以後使用的參考(可能不太可能,但始終可能!),因爲p_vec到那時將不復存在。

另外兩個選項是創建一個包裝vector[double]的Cython類。這對你來說顯然是更多的工作,但是避免在每次調用py_util時進行類型轉換。或者,您可能可以修改util,因此它使用double*,並在Python端使用numpy數組或Python數組。