Chinaunix
标题:
如何使用C来扩展python功能。
[打印本页]
作者:
xichen
时间:
2005-06-17 11:21
标题:
如何使用C来扩展python功能。
作者:梅劲松
本文档和所包含程序为MIT授权
我们来实现一个简单的加法的扩展模块!
建立一个目录,整个目录名中不要包含中文。在目录下建立
add.c,内容如下:
#include <Python.h>;
static PyObject* add(PyObject *self, PyObject *args);
//一定声明为static,把他们限制在这个文件范围里。 几乎所有的参数都是PyObject类型。 在python,每个东西都是object。
static PyObject* add(PyObject* self, PyObject* args)
{
int x=0 ;
int y=0;
int z=0;
if (! PyArg_ParseTuple(args, "i|i", &x, &y))
return NULL;
/*第一个参数是self,这个是python用的, 每个函数都要有。我们暂时不管。args是一个参数列表。她把所有的参数都整合成一个string。所以
我们需要从这个string里来解析我们的参数。PyArg_ParseTuple来完成这个任务。第一个参数是args, 就是我们要转换的参数。第二个是格式符号。
“s”代表是个string。 从args里提取一个参数就写"s", 两个的话就写"s|s", 如果是一个string,一个int,就写"s|i", 和printf差不多。第三个
参数就是提取出来的参数放置的真正位置。必须传递这个参数的地址。对于add, 他将提取两个参数。分别是x和y。*/
z=x+y;
return Py_BuildValue("i", z);
/*调用完之后我们需要返回结果。这个结果是c的type或者是我们自己定义的类型。必须把他转换成PyObject, 让python认识。这个用Py_BuildValue
来完成。他是PyArg_ParseTuple的逆过程。他的第一个参数和PyArg_ParseTuple的第二个参数一样, 是个格式化符号。第三个参数
是我们需要转换的参数。Py_BuildValue会把所有的返回只组装成一个tutple给python。*/
}
static PyMethodDef addMethods[] =
{
{"add", add, METH_VARARGS, "Execute a shell command."},
{NULL, NULL, 0, NULL}
};
/*这个是一个c的结构。他来完成一个映射。 我们需要把我们扩展的函数都映射到这个表里。表的第一个字段是python真正认识的。是python
里的方法名字。 第二个字段是python里的这个方法名字的具体实现的函数名。 在python里调用add, 真正执行的是用c写的add函数。
第三个字段是METH_VARARGS, 他告诉python,add是调用c函数来实现的。第四个字段是这个函数的说明。如果你在python里来help这个函数,
将显示这个说明。相当于在python里的函数的文档说明。*/
PyMODINIT_FUNC initadd()
{
Py_InitModule("add", addMethods);
}
/*注意,这个函数的名字不能改动。 必须是init+模块名字。 我们的模块名字是add。所以这个函数是initadd()。
这样python在导入add 的模块时候,才会找到这个函数,并调用。这个函数调用Py_InitModule来将模块名字和映射表结合在一起。
他表示,add这个模块使用addMethods这个映射表。python应该这样导入我们的module的.*/
复制代码
然后建立setup.py这个文件,内容如下:
#! /usr/bin/python
from distutils.core import setup, Extension
module1 = Extension('add', sources = ['add.c'])
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,然后:
D:\c>;python
Python 2.3.3 (#51, Dec 18 2003, 20:22:39) [MSC v.1200 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>;>;>; import add
>;>;>; print dir(add)
['__doc__', '__file__', '__name__', 'add']
>;>;>; add.add(1,2)
3
>;>;>;
复制代码
作者:
jasonnbfan
时间:
2005-07-04 02:04
标题:
如何使用C来扩展python功能。
真详细,支持,最想看到类似这样的帖子.
作者:
xichen
时间:
2005-07-04 09:13
标题:
如何使用C来扩展python功能。
谢谢支持,希望你能更快掌握python的各种技巧。
也欢迎你在这里提出你的各种问题。
作者:
nfqx
时间:
2005-07-11 16:33
标题:
如何使用C来扩展python功能。
我怎么编译出来的结果是add.so??一个共享库???
作者:
xichen
时间:
2005-07-12 09:10
标题:
如何使用C来扩展python功能。
如果你是在unix下,确实是so文件。
将目录下直接import就可以使用了。
作者:
jjyoung
时间:
2005-07-13 22:14
标题:
如何使用C来扩展python功能。
赞啊,偶来来‘画蛇添足’一下:
打包分发:python setup.py sdist
作成exe: python setup.py bdist_wininst
作成rpm: python setup.py bdist_rpm
作者:
xichen
时间:
2005-07-14 13:39
标题:
如何使用C来扩展python功能。
哈,非常感谢!
作者:
pythoner
时间:
2005-07-29 08:58
标题:
如何使用C来扩展python功能。
我很谨慎的问,我可以在我的小站上转这张贴吗
我现在对版权很敏感啊!
作者:
hoxide
时间:
2005-07-29 10:56
标题:
如何使用C来扩展python功能。
MIT授权
转贴没问题的, 不过要保证文档完整性.
作者:
pythoner
时间:
2005-07-30 14:51
标题:
如何使用C来扩展python功能。
文档完整性当然是可以保证,那就谢谢了!!
作者:
wanbin
时间:
2005-08-03 22:12
提示:
作者被禁止或删除 内容自动屏蔽
作者:
unixer2i
时间:
2006-01-30 20:59
楼主,我按照你给的提示实现一下, 可是在执行时报错。给我的提示是setup.py文件内setup()函数有误,没有出现add.pyd文件呀,我哪里做错了? 帮我看看,我的系统是MS WINDOWS XP+Python 2.4.2+python-mode for ntemacs
作者:
converse
时间:
2006-02-04 11:41
个人认为自己这样写python扩展只适用于函数,变量比较少的时候,如果要大规模的导入的话我觉得swig比较好用的说....
作者:
xichen
时间:
2006-02-05 10:28
unixer2i 我是在xp+vc6.0+python 2.3 下做的。2。4没有测试过。
converse python来使用C扩展的话,并不需要大量的使用函数。每个扩展就是一个功能,一个模块,一个对象。即使C程序是需要进行复杂运算的庞大程序,输入条件也是很少的。高楼大厦也是靠砖块间的少量水泥粘合起来的。
作者:
jemy.zhang
时间:
2008-08-19 14:46
感谢!
作者:
moonflow
时间:
2012-03-05 15:34
相当赞呀
作者:
yjphhw
时间:
2012-03-06 09:38
本帖最后由 yjphhw 于 2012-03-06 09:38 编辑
超级感谢,,已经在gcc下可以运行了。非常感谢。。
转贴了,留作备用。
作者:
li_LMP
时间:
2012-08-07 08:53
写得太好了。一次试验成功!谢谢
作者:
li_LMP
时间:
2012-08-09 10:52
好文章, 谢谢!
作者:
zhouqi5063
时间:
2014-12-19 14:56
非常好!已经试验了
传参还有别的方法吗?如果参数很多的话,这种方式不太方便
作者:
Jacob_emma
时间:
2015-08-25 21:40
10年前的老文章翻出来看还是那么好看
作者:
yyl910606
时间:
2015-08-26 14:47
本帖最后由 yyl910606 于 2015-08-26 14:50 编辑
用C 下python 模块 需要看很多东西 比如 从Python 转换到c 然后从c 转换到python
如输入一个参数 就要知道这个参数是什么类型, 然后在c 里面写转换函数 把python 的变量转换成c 的
然后返回值 也需要转换成 python 的
如 把参数转换成 c PyArg_ParseTuple(args, "si", &sval, &ival); //s 是string i 是int
把返回值转换成python Py_BuildValue("si", sval, ival);
作者:
sytpb
时间:
2015-10-28 09:12
回复
1#
xichen
我最近要用到这个方面,有更全的资料介绍吗? 推荐一下,系统的看一下想,谢谢!
作者:
substr函数
时间:
2015-10-28 19:05
老文章翻出来看还是那么好看,谢谢!
作者:
2008ohmygod
时间:
2015-11-04 22:16
good, mark
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2