使用 ctypes 在 python 中使用 C++ 库

Posted

技术标签:

【中文标题】使用 ctypes 在 python 中使用 C++ 库【英文标题】:using C++ libraries in python using ctypes 【发布时间】:2016-01-21 06:16:21 【问题描述】:

我有一个 C++ 库,它提供了各种用于管理数据的类。我有图书馆的源代码。 我正在尝试使用 ctypes 从 python 调用这个库的 lda.cpp 的函数。该函数又使用库中所有其他 .cpp 文件中的函数。

//lda.cpp
#include "model.h"
#include <stdio.h>
#include "lda.h"

int lda_est(double alpha, double beta) 
    model lda;
    if (lda.model_est(alpha, beta)) 
         return 1;
    

    lda.estimate();

    return 0;

我发现我需要使用 C++ 包装器将函数声明为 extern,然后将它们编译为 .so 文件。我的问题是我应该如何制作这个包装文件?我应该将库中的所有函数声明为 extern 还是仅声明我想从 python 调用的函数?

【问题讨论】:

你的函数需要声明为int extern "C" lda_est(double alpha, double beta),见***.com/a/7061012/5781248 如果你对extern C不满意,那么你不妨看看boost-python或github.com/wjakob/pybind11 【参考方案1】:

ctypes 是一种工具,用于集成您无法更改的现有库。由于您拥有源代码并愿意更改它们,因此您也可以用 C++ 编写一个 Python 模块,其中有多个工具包,例如Boost.Python。换句话说,@Deleisha 是对的,ctypes 是错误的工作工具。

请注意,您仍然可以通过包装函数和类从现有库创建 Python 模块。在那里使用工具包而不是 extern "C" 包装器仍然有意义。首先,它简化了包装类,其次,您不需要 C++ 中的 extern "C" 包装器和 Python 中的另一个 ctypes 包装器。

【讨论】:

以上是关于使用 ctypes 在 python 中使用 C++ 库的主要内容,如果未能解决你的问题,请参考以下文章

使用ctype在python中调用c

使用ctypes在Python中调用C++动态库

使用ctypes实现python类型和C语言类型之间的相互转化

Python ctypes 模块

python3使用ctypes在windows中访问C和C++动态链接库函数示例

使用ctypes python包装C函数返回未知大小的数组