测试积点老人 发表于 2018-12-17 15:57:40

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



Miss_love 发表于 2021-1-5 16:59:59

支持分享
页: [1]
查看完整版本: Python C 语言扩展