使用 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++ 库的主要内容,如果未能解决你的问题,请参考以下文章
使用ctypes实现python类型和C语言类型之间的相互转化