python的底层是c/c++,所以两种语言都有相互的接口,在之前已经写过一篇c++调用python接口让opencv中的cv::Mat类型在两种语言中相互传递,ubuntu下C++与Python混编,opencv中mat类转换。python
如今文本将介绍python如何调用c++中的模块。c++
实现python和c++交互的方式有好几种,就目前本人见过的就有四种ubuntu
本文主要介绍Python.h中的c++接口如何使用时。函数
#include <Python.h> //引入头文件 //定义加法 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能够去开头提到的文章中找。.net
若是你的python版本是3以上,那么就将上面最后一个函数更改成以下代码code
// 重点 // 下面这个函数是针对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); }
愿工做顺利!blog