python - 使用 cython 将 c++ 函数暴露给 python

标签 python c++ cython

我正在尝试使用 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/

相关文章:

windows - python cythonize 期间出现 "Intel\iCLS was unexpected"错误

python - 如何让 Cython 使用对象文件?

python - 使用 findall() 方法解析简单的数学方程

python - 将搜索添加到文件类型对象的廉价方法

c++ - 在 C++ 中将对象转换为 vector

c++ - 找到打印一切的功能?

python - 我可以使用正则表达式反向引用修改后的捕获吗?

python - 这个 print (' ' *len(msg), end ='' ) 调用有什么作用?

c++ - 如何将 vector 的第一个元素移动到另一个 vector 的末尾

python - 将 Cython 中的 numpy 数组传递给需要动态分配数组的 C 函数