分享

连接Python与C的桥梁—Pyrex

 sofes 2012-02-29
连接Python与C的桥梁—Pyrex
2011年05月10日 星期二 21:49

使用Pyrex将从Pyrex代码生成一个C源文件,编译该C源文件即可生成Python的扩展模块。从而使编写Python的C扩展更加容易。PyrexPython 中添加了类型声明,使得Python与C数据类型相互转换变得容易。

8.5.1  安装使用Pyrex

Pyrex的安装十分方便,从其官方网站http://www.cosc./greg.ewing/python/Pyrex下载Pyrex的ZIP文件。将其解压后,进入其目录,运行如下所示命令将安装Pyrex

python setup.py install

Pyrex安装好后有多种方法可以使用其编译Pyrex文件,但由于在Windows平台下,最新的Python 2.5版是使用Visual Studio 2003.NET编译的,如果没有安装Visual Studio 2003.NET,则最好采用Pyrex的ZIP文件中的“pyrexc.py”首先将Pyrex文件编译成C源文件,然后再将C源文件手工编译成Python扩展。首先编写如下所示“test.pyx”文件。

def test():

    return 'A test file!'

将“pyrexc.py”复制到“test.pyx”所在的目录,运行如下所示的命令。

pyrexc.py test.pyx

运行完命令后将在目录中生成“test.c”,可以在VC++ 6.0中将“test.c”编译成Python扩展模块。在Python中调用编译好的test模块,如下所示。

>>> import test

>>> test.test()

'A test file!'

8.5.2 Pyrex文件语法

Pyrex文件完全使用了Python的语法。在编写Pyrex文件时,只需按照Python的语法编写即可。在Pyrex中可以定义C语言中的结构体、枚举等类型,也可以使用C语言中的数据类型。

1.数据类型

Pyrex定义了与C语言中相对应的数据类型,使用“cdef”可以在Pyrex中使用C语言中的数据类型。代码如下所示。

cdef char *s                        #相当于C中的字符串

cdef int x,y                        #相当于C中的int型

cdef int z[4]                   #相当于C中的数组

cdef float f                        #相当于C中的浮点型

cdef int *p                     #相当于C中的指针

2.结构体、联合及枚举

除了定义C中的数据类型以外,还可以使用“cdef”定义C中的结构体、联合、枚举等。代码如下所示。

cdef struct Human:              #定义结构体

    char *name

    char *sex

    int age

cdef union Fruit:               #定义联合体

    char *apple

    char *banana

    char *orange

cdef enum:                      #定义枚举

    Monday

    Tuesday

    Wednesday

    Thursday

    Friday

    Saturday

    Sunday

3.函数

使用“cdef”可以像使用Python中的“def”一样来定义一个函数。在Pyrex文件中既可以使用“def”来定义函数,也可以使用“cdef”来定义函数。不同的是,使用“def”定义的函数,只能使用Python的数据类型,而使用“cdef”定义的函数则可以使用C中的数据类型。另外,使用“def”定义的函数可以被模块导出,在Python中使用。而使用“cdef”定义的函数则不能被Python使用。代码如下所示。

cdef int sum(int x, int y):         #使用C数据类型定义函数

    return x + y

cdef sum(x, y):                     #如果没有声明参数类型,则表示为Python中的类型

    return x + y

cdef object sum(object x, object y):    #使用object显式地表示参数为Python中的类型

    return x + y

4.使用类

使用“cdef”也可以在Pyrex文件中定义类。需要注意的是如果通过继承创建类,则父类应该在该Pyrex文件中定义,否则应该使用“extern”表示父类在外部定义。代码如下所示。

cdef class Stud:                        #使用cdef定义类

    def setname(self,n):             #定义setname方法

        self.name= n

    def showname(self):              #定义showname方法

        print self.name

cdef class Student(Stud):           #通过继承创建类

    def setnum(self,n):              #定义setnum方法

        self.num= n

    def shownum(self):               #定义shownum方法

        printself.num

5.使用include和外部C函数

Pyrex支持类似于C语言头文件的“.pxi”文件。使用“.pxi”可以将较大的Pyrex文件分成多个文件,这样便于维护。“.pxi”文件像C语言中的头文件一样,只要使用“include”包含就可以了。除此以外,在Pyrex中也可以使用C语言头文件中声明的函数原型。例如使用Python/CAPI中的PyRun_SimpleString函数,则可以使用如下写法。

cdef extern from "Python.h":

    int PyRun_SimpleString(char*command)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多