python的底层是c/c++,因此两种语言都有相互的接口,在以前已经写过一篇c++调用python接口让opencv中的cv::Mat类型在两种语言中相互传递,ubuntu下C++与Python混编,opencv中mat类转换。
现在文本将介绍python如何调用c++中的模块。
实现python和c++交互的方式有好几种,就目前本人见过的就有四种
boost python
Python.h的c++接口
swig
python中ctypes
本文主要介绍Python.h中的c++接口如何使用时。
#include //引入头文件
//定义加法
int add(int a,int b){
return a+b;
}
//国际惯例,初始python相关操作
#if (PY_VERSION_HEX >= 0x03000000)
static void *init_ar() {
#else
static void init_ar(){
#endif
Py_Initialize();
import_array();
return NUMPY_IMPORT_ARRAY_RETVAL;
}
// 封装加法操作,args为调用时传入的python参数
static PyObject* function_add(PyObject* self, PyObject *args){
int ptr1,ptr2;
// 将两个参数传入,并转换为int
if(!PyArg_ParseTuple(args,"",&ptr1,&ptr2)){
return NULL;
}
int result = add(ptr1,ptr2);
return PyLong_FromLong(res);
}
// 定义的方法表,用于在python中查找
static PyMethodDef GreateModuleMethods[] = {
{
"add",
function_add,
METH_VARARGS,
""
},
//如果有多个函数可以写多个
{NULL, NULL, 0, NULL}
};
// 重点
// 下面这个函数是针对python2的
// 下面这个函数是针对python2的
// 下面这个函数是针对python2的
// 函数名必须以init开头,后面的必须和.so名相同,这里会生成greate_module.so
PyMODINIT_FUNC initgreat_module(void) {
(void) Py_InitModule("great_module", GreateModuleMethods);
}
以上这段代码生成.so文件,放在和python文件同级目录就可以用了。生成.so文件的CMakelists.txt可以去开头提到的文章中找。
如果你的python版本是3以上,那么就将上面最后一个函数更改为如下代码
// 重点
// 下面这个函数是针对python3的
// 下面这个函数是针对python3的
// 下面这个函数是针对python3的
static struct PyModuleDef ModuleDef={
PyModuleDef_HEAD_INIT,
"great_module", //和.so 同名
-1,
GreateModuleMethods
};
//PyInit_后面必须和.so同名
PyMODINIT_FUNC PyInit_greate_module(void){
return PyModule_Create(&ModuleDef);
}
愿工作顺利!