Python C 语言扩展
本帖最后由 测试积点老人 于 2018-12-17 15:58 编辑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=)])
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-devsudo apt-get install python-dev
支持分享
页:
[1]