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