51Testing软件测试论坛

标题: Python C 语言扩展 [打印本页]

作者: 测试积点老人    时间: 2018-12-17 15:57
标题: Python C 语言扩展
本帖最后由 测试积点老人 于 2018-12-17 15:58 编辑

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

1). 包含 Python 头文件。

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

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

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

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


  1. #include <Python.h>

  2. /* C 函数 */
  3. double Add(double a, double b)
  4. {
  5.         return a + b;
  6. }

  7. double Sub(double a, double b)
  8. {
  9.         return a - b;
  10. }

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

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

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

  22. static PyObject * Extest_Sub(PyObject *self, PyObject *args)
  23. {
  24.         double a;
  25.         double b;

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

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

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

  36. /* 增加模块初始化函数 void initModule() */
  37. void initExtest()
  38. {
  39.         Py_InitModule("Extest", ExtestMethods);
  40. }
复制代码


2. 编译

2.1 创建setup.py
  1. #!/usr/bin/env python

  2. from distutils.core import setup, Extension

  3. MOD = 'Extest'
  4. setup(name=MOD, ext_modules=[Extension(MOD, sources=['Extest.c'])])
复制代码

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

编译

  1. $ python setup.py build
复制代码

安装模块

  1. $ python setup.py install
复制代码


2.3 导入并执行
  1. >>> import Extest
  2. >>> Extest.Add(4,5)
  3. 9.0
  4. >>> Extest.Sub(5,4)
  5. 1.0
  6. >>>
复制代码

PS:Windows 编译出错

如果出现

  1. F:\01_Code\01_Python\Python_C\Python_C>python setup.py build
  2. running build
  3. running build_ext
  4. building 'Extest' extension
  5. error: Unable to find vcvarsall.bat
复制代码

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

变量名:VS90COMNTOOLS

变量值:%VS100COMNTOOLS%


PPS:Linux 缺少头文件

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

  1. sudo apt-get install python-dev
复制代码





作者: Miss_love    时间: 2021-1-5 16:59
支持分享




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2