![](/img/trans.png)
[英]Cython - Exposing C++ (vector and non-vector) objects returned by C++ function to Python
[英]Exposing a c++ function to python using cython
我试图使用cython将c ++函数暴露给python,如下所示:
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:无法将'double(int,int,double,double,double,int,int,int,const vector [double]&,double)'转换为Python对象
这有什么问题?
在此先感谢您的帮助。
你必须先告诉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
时都py_util
,因此可能有点慢。 如果util
存储了以后使用的引用(可能不太可能,但总是可能的话!),这也是一个问题,因为到那时p_vec
将不复存在。
另外两个选项是创建一个包装vector[double]
的Cython类。 这对你来说显然更有用,但是在每次调用py_util
时都要避免类型转换。 或者,您可以修改util
因此它使用double*
,并在Python端使用numpy数组或python数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.