我正在尝试使用 cython 向 python 公开一个 c++ 函数,如下所示:
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
这里有什么问题?
预先感谢您的所有帮助。
最佳答案
您必须首先告诉 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 可以自动将包含适当类型的列表/元组转换为 vector 。不利的一面是,每次您调用 py_util
时都会这样做所以可能有点慢。如果util
也是一个问题自 p_vec
起存储引用供以后使用(可能不太可能,但总是可能的!)届时将不复存在。
另外两个选项是创建一个包装 vector[double]
的 Cython 类.这显然对你来说有点多,但避免了每次调用 py_util
时的类型转换。 .或者你可以修改 util
所以它使用 double*
,并在 Python 端使用 numpy 数组或 python 数组。
关于python - 使用 cython 将 c++ 函数暴露给 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36899655/