Python调用C/C++函数

下面以一个简单的例子说明如何把一个C函数编译为共享库供python调用的:

C文件wrap.cc如下:

#include <Python/Python.h>

int fact(int n)
{
  if (n <= 1) return 1;
  else return n * fact(n-1);
}

// python包装
PyObject *wrap_fact(PyObject* self, PyObject* args)
{
  int n, result;
  if (!PyArg_ParseTuple(args, "i:fact", &n)) // 把python的变量转换成c的变量
    return NULL;
  result = fact(n);
  return Py_BuildValue("i", result); // 把c的返回值n转换成python的对象
}

// 方法列表
// 方法列表中的每项由四个部分组成:方法名、导出函数、参数传递方式和方法描述。
// 方法名是从Python解释器中调用该方法时所使用的名字。参数传递方式则规定了
// Python向C函数传递参数的具体形式,可选的两种方式是METH_VARARGS和METH_KEYWORDS,
// 其中METH_VARARGS是参数传递的标准形式,它通过Python的元组在Python解释器
// 和C函数之间传递参数,若采用METH_KEYWORD方式,则Python解释器和C函数之间将
// 通过Python的字典类型在两者之间进行参数传递。
static PyMethodDef exampleMethods[] =
{
  {"fact", wrap_fact, METH_VARARGS, "Caculate N!"},
  {NULL, NULL}
};

// 初始化函数
PyMODINIT_FUNC initexample()
{
  PyObject *m;
  m = Py_InitModule("example", exampleMethods);
}
运行生成共享库.so供python调用:
g++ -fPIC -c -I /usr/include/python2.3 wrap.cc

g++ -shared -o example.so wrap.o -lpython


测试:

python test.py

# -*- coding:utf-8 -*-
#!/usr/bin/python
import sys
sys.path.append('./') # 添加example.so所在的路径
import example
a = example.fact(4)
print a
输出:24

猜你喜欢

转载自blog.csdn.net/u012332571/article/details/70195448
今日推荐