最近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一致。