Python调用c++函数

本文详细介绍了如何使用Python.h中的C++接口实现Python与C++的交互,包括定义C++函数、创建Python模块及在Python环境中调用C++函数的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 <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可以去开头提到的文章中找。

如果你的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);
}

愿工作顺利!

转载于:https://my.oschina.net/u/1046919/blog/2995857

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值