免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 18696 | 回复: 24
打印 上一主题 下一主题

如何使用C来扩展python功能。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-17 11:21 |只看该作者 |倒序浏览
作者:梅劲松
本文档和所包含程序为MIT授权

我们来实现一个简单的加法的扩展模块!
建立一个目录,整个目录名中不要包含中文。在目录下建立
add.c,内容如下:
  1. #include <Python.h>;

  2. static PyObject* add(PyObject *self, PyObject *args);
  3. //一定声明为static,把他们限制在这个文件范围里。 几乎所有的参数都是PyObject类型。 在python,每个东西都是object。

  4. static PyObject* add(PyObject* self, PyObject* args)
  5. {
  6.    int x=0 ;
  7.    int y=0;
  8.    int z=0;
  9.         if (! PyArg_ParseTuple(args, "i|i", &x, &y))
  10.                 return NULL;
  11.         /*第一个参数是self,这个是python用的, 每个函数都要有。我们暂时不管。args是一个参数列表。她把所有的参数都整合成一个string。所以
  12.         我们需要从这个string里来解析我们的参数。PyArg_ParseTuple来完成这个任务。第一个参数是args, 就是我们要转换的参数。第二个是格式符号。
  13.         “s”代表是个string。 从args里提取一个参数就写"s", 两个的话就写"s|s", 如果是一个string,一个int,就写"s|i", 和printf差不多。第三个
  14.         参数就是提取出来的参数放置的真正位置。必须传递这个参数的地址。对于add, 他将提取两个参数。分别是x和y。*/
  15. z=x+y;
  16. return Py_BuildValue("i", z);
  17.     /*调用完之后我们需要返回结果。这个结果是c的type或者是我们自己定义的类型。必须把他转换成PyObject, 让python认识。这个用Py_BuildValue
  18.         来完成。他是PyArg_ParseTuple的逆过程。他的第一个参数和PyArg_ParseTuple的第二个参数一样, 是个格式化符号。第三个参数
  19.         是我们需要转换的参数。Py_BuildValue会把所有的返回只组装成一个tutple给python。*/
  20. }

  21. static PyMethodDef addMethods[] =
  22. {
  23.    {"add",  add, METH_VARARGS, "Execute a shell command."},
  24.    {NULL, NULL, 0, NULL}
  25. };
  26. /*这个是一个c的结构。他来完成一个映射。 我们需要把我们扩展的函数都映射到这个表里。表的第一个字段是python真正认识的。是python
  27. 里的方法名字。 第二个字段是python里的这个方法名字的具体实现的函数名。 在python里调用add, 真正执行的是用c写的add函数。
  28. 第三个字段是METH_VARARGS, 他告诉python,add是调用c函数来实现的。第四个字段是这个函数的说明。如果你在python里来help这个函数,
  29. 将显示这个说明。相当于在python里的函数的文档说明。*/

  30. PyMODINIT_FUNC initadd()
  31. {
  32.        Py_InitModule("add", addMethods);
  33. }
  34. /*注意,这个函数的名字不能改动。 必须是init+模块名字。 我们的模块名字是add。所以这个函数是initadd()。
  35. 这样python在导入add 的模块时候,才会找到这个函数,并调用。这个函数调用Py_InitModule来将模块名字和映射表结合在一起。
  36. 他表示,add这个模块使用addMethods这个映射表。python应该这样导入我们的module的.*/
复制代码

然后建立setup.py这个文件,内容如下:
  1. #! /usr/bin/python

  2. from distutils.core import setup, Extension

  3. module1 = Extension('add', sources = ['add.c'])

  4. setup (name = 'PackageName', version = '1.0', description = 'This is a demo package', ext_modules = [module1])
复制代码

在msdos下进入这个目录,输入命令setup.py build。
如果你能编译成功,到你所在目录的build\lib.win32-2.3下会发现add.pyd文件,将文件复制到你所需要的地方,启动python,然后:

  1. D:\c>;python
  2. Python 2.3.3 (#51, Dec 18 2003, 20:22:39) [MSC v.1200 32 bit (Intel)] on win32
  3. Type "help", "copyright", "credits" or "license" for more information.
  4. >;>;>; import add
  5. >;>;>; print dir(add)
  6. ['__doc__', '__file__', '__name__', 'add']
  7. >;>;>; add.add(1,2)
  8. 3
  9. >;>;>;
复制代码

论坛徽章:
0
2 [报告]
发表于 2005-07-04 02:04 |只看该作者

如何使用C来扩展python功能。

真详细,支持,最想看到类似这样的帖子.

论坛徽章:
0
3 [报告]
发表于 2005-07-04 09:13 |只看该作者

如何使用C来扩展python功能。

谢谢支持,希望你能更快掌握python的各种技巧。
也欢迎你在这里提出你的各种问题。

论坛徽章:
0
4 [报告]
发表于 2005-07-11 16:33 |只看该作者

如何使用C来扩展python功能。

我怎么编译出来的结果是add.so??一个共享库???

论坛徽章:
0
5 [报告]
发表于 2005-07-12 09:10 |只看该作者

如何使用C来扩展python功能。

如果你是在unix下,确实是so文件。
将目录下直接import就可以使用了。

论坛徽章:
0
6 [报告]
发表于 2005-07-13 22:14 |只看该作者

如何使用C来扩展python功能。

赞啊,偶来来‘画蛇添足’一下:
打包分发:python setup.py sdist
作成exe:   python setup.py bdist_wininst
作成rpm:   python setup.py bdist_rpm

论坛徽章:
0
7 [报告]
发表于 2005-07-14 13:39 |只看该作者

如何使用C来扩展python功能。

哈,非常感谢!

论坛徽章:
0
8 [报告]
发表于 2005-07-29 08:58 |只看该作者

如何使用C来扩展python功能。

我很谨慎的问,我可以在我的小站上转这张贴吗   
我现在对版权很敏感啊!

论坛徽章:
0
9 [报告]
发表于 2005-07-29 10:56 |只看该作者

如何使用C来扩展python功能。

MIT授权
转贴没问题的, 不过要保证文档完整性.

论坛徽章:
0
10 [报告]
发表于 2005-07-30 14:51 |只看该作者

如何使用C来扩展python功能。

文档完整性当然是可以保证,那就谢谢了!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP