不同版本python 调用 C++ 接口

最近ubantu上做python项目用到了C++接口,觉着有点意思,特记录一下。

这里将会介绍python2.x 和 python 3.x 调用C++接口的方法:

话不多说,

1、python2.x

 C++ 文件名 test.cpp

#include 

static PyObject * Add(PyObject * self, PyObject * args)
{
    int x, y;
    if(!PyArg_ParseTuple(args, "ii", &x, &y)) return NULL;
    int out = x + y;
    return Py_BuildValue("i", out);
}

static PyMethodDef testMethods[] = {
    {"Add", Add, METH_VARARGS, "add function"}
    {NULL, NULL, 0, NULL}   /* Sentinel */
}

extern "C"
void inittest(){
    Py_InitModule("test", testMethods);
}

ubantu编译成动态库命令

g++ test.cpp -fPIC -shared -o test.so -I/usr/include/python2.7 -lboost_python

python调用

  直接进入 test.so所在目录,在python文件中使用import test即可像普通module一般调用。

2、python3.x

#include 

static PyObject * Add(PyObject * self, PyObject * args)
{
    int x, y;
    if(!PyArg_ParseTuple(args, "ii", &x, &y)) return NULL;
}

static PyMethodDef testMethods[] = {
    {"Add", Add, METH_VARARGS, "add function"},
    {NULL, NULL, 0, NULL} /* Sentinel */
}
static struct PyModuleDef testmodule = {
    PyModuleDef_HEAD_INIT,
    "test",
    NULL,
    -1,
    testMethods
}
extern "C"{
PyMODINIT_FUNC PyInit_test(void)
    PyObject * m;
    m = PyModule_Create(&testmodule);
    if (m == NULL)
        return NULL;
    return m;
}
    
}

 ubantu下编译和python调用方法与python2.x一致。

你可能感兴趣的:(ML)