Python調用c++函數

python的底層是c/c++,所以兩種語言都有相互的接口,在之前已經寫過一篇c++調用python接口讓opencv中的cv::Mat類型在兩種語言中相互傳遞,ubuntu下C++與Python混編,opencv中mat類轉換python

如今文本將介紹python如何調用c++中的模塊。c++

實現python和c++交互的方式有好幾種,就目前本人見過的就有四種ubuntu

  • boost python
  • Python.h的c++接口
  • swig
  • python中ctypes

本文主要介紹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

相關文章
相關標籤/搜索