c调用python接口_通过Python自带C/C++接口实现python与c/c++相互调用

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);

}

愿工作顺利!

你可能感兴趣的:(c调用python接口)