51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 2121|回复: 1
打印 上一主题 下一主题

Python C 语言扩展

[复制链接]
  • TA的每日心情
    无聊
    5 天前
  • 签到天数: 406 天

    连续签到: 3 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2018-12-17 15:57:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 测试积点老人 于 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
    复制代码




    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-5 11:26 , Processed in 0.188021 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表