Python C 语言扩展

1. 创建应用程序代码,用样板包装代码

1). 包含 Python 头文件。

2) 为每个模版的每一个函数增加 PyObject * Module_func() 的包装函数。

3) 为每个模块的每一个函数增加 PyMethodDef * ModuleMethods[] 的数组。

4) 增加模块初始化函数 void initModule()。

模块名为 Extest,包含 Add 和 Sub 方法。

#include <Python.h>

/* C 函数 */
double Add(double a, double b)
{
	return a + b;
}

double Sub(double a, double b)
{
	return a - b;
}

/* 为每个模块的每一个函数增加包装函数  */
static PyObject * Extest_Add(PyObject *self, PyObject *args)
{
	double a;
	double b;

	/* PyArg_ParseTuple 把 Python传过来的参数转为 C */
	if (!PyArg_ParseTuple(args, "dd", &a, &b))
		return NULL;

	/* Py_BuildValue 把 C 的数据转为 Python 的一个或一组对象,然后返回 */
	return (PyObject *)Py_BuildValue("d", Add(a, b));
}

static PyObject * Extest_Sub(PyObject *self, PyObject *args)
{
	double a;
	double b;

	if (!PyArg_ParseTuple(args, "dd", &a, &b))
		return NULL;

	return (PyObject *)Py_BuildValue("d", Sub(a, b));
}

/* 为每个模块增加一个PyMethodDef数组 */
static PyMethodDef ExtestMethods[] = {
	{ "Add", Extest_Add, METH_VARARGS },
	{ "Sub", Extest_Sub, METH_VARARGS },
	{NULL, NULL}
};

/* 增加模块初始化函数 void initModule() */
void initExtest()
{
	Py_InitModule("Extest", ExtestMethods);
}

2. 编译

2.1 创建setup.py

#!/usr/bin/env python

from distutils.core import setup, Extension

MOD = 'Extest'
setup(name=MOD, ext_modules=[Extension(MOD, sources=['Extest.c'])])

2.2 通过运行 setup.py 来编译和链接代码

编译

$ python setup.py build

安装模块

$ python setup.py install

2.3 导入并执行

>>> import Extest
>>> Extest.Add(4,5)
9.0
>>> Extest.Sub(5,4)
1.0
>>>

PS:Windows 编译出错

如果出现

F:\01_Code\01_Python\Python_C\Python_C>python setup.py build
running build
running build_ext
building 'Extest' extension
error: Unable to find vcvarsall.bat

如果为 Python2.7,并且安装了VS2010,则可以通过在环境变量中添加:

变量名:VS90COMNTOOLS

变量值:%VS100COMNTOOLS%

PPS:Linux 缺少头文件

如果缺少头文件,需要安装 python-dev

sudo apt-get install python-dev

---

参考资料:

《Python 核心编程(第二版)》

Python 帮助文档


你可能感兴趣的:(python)