Cython基础--Cython入门
2014-01-12 13:48
357 查看
Cython入门 1 Cython是什么? 对你没有看错,是Cython,不是Python当初也我也对这个名字感到很奇怪,但是了解之后,再才知这是我一直想要的工具,比起swig,这个工具要好上很多它是一个用来快速生成Python扩展模块(extention module)的工具它的语法是python语言语法和c语言语法的混血他比swig更容易编写python的扩展模块也许你会说swig可以直接通过c的头文件生成扩展模块,但是swig对回调函数的支持不是很好,另外,如果用swig,很多情况下,你要写额外的代码将输入的参数转换成python对象以及将输出转成python对象,例如如果封装的一个C函数的参数是输入输出的话,又如如果C函数的参数中有回调函数的话而在Cython,C里的类型,如int,float,long,char*等都会在必要的时候自动转成python对象,或者从python对象转成C类型,在转换失败时会抛出异常,这正是Cython最神奇的地方另外,Cython对回调函数的支持也很好。总之,如果你有写python扩展模块的需求,那么Cython真的是一个很好的工具2 安装 2.1 Windows下安装 先从http://cython.org下载软件包:Cython-0.19.2.zip解压到一个目录,如D:\Cython-0.19.2从开始菜单里打开Visual Studio Command Prompt,例如:MicroSoft Visual Studio 2010-> Visual Studio Tools -> Visual Studio Command Prompt(2010)敲入如下命令:D:cd Cython-0.19.2python setup.py install命令执行完后就会把cython安装到python的安装目录下 2.2 Ubuntu下安装 apt-get install cython3 第一个例子: 3.1 创建helloworld目录 创建helloworld.pyx,内容如下: cdef extern from"stdio.h": extern int printf(const char *format, ...) def SayHello(): printf("hello,world\n") 代码非常简单,就是调用了C函数printf打印hello,world 4 如何编译 4.1 最方便的当然是利用python的Distutils了,看下如何来实现 先在helloworld目录下创建Setup.py,内容如下: from distutils.core import setupfrom distutils.extension import Extensionfrom Cython.Build import cythonize setup( name = 'helloworld', ext_modules=cythonize([ Extension("helloworld", ["helloworld.pyx"]), ]),) 编译: python Setup.py build安装: python Setup.py install安装后,会将在build/lib.???目录下生成的helloworld.pyd拷贝到Lib/site-packages 注: 有时我们只是希望测试一下,并不希望安装,这时可以把build/lib.???目录下的helloworld.pyd拷贝到当前目录 或者在importhelloworld前执行脚本:import sys;sys.path.append(pathof helloworld.pyd) 测试: >>>import helloworld >>>helloworld.SayHello() hello,world 4.2 其次就是可以自己写Makefile进行编译 写Makefile的好处就是可以知道编译的实质: 下面是用于Windows下编译的Makefile,Makefile内容如下: ALL :helloworld.pyd helloworld.c : helloworld.pyx cython -o helloworld.c helloworld.pyx helloworld.obj :helloworld.c cl -c -Id:\python27\include helloworld.c helloworld.pyd :helloworld.obj link /DLL /LIBPATH:d:\python27\libshelloworld.obj /OUT:helloworld.pyd 执行命令: set PATH=D:\Python27\Scripts;%PATH% nmake 进行编译,会在根目录下生成helloworld.pyd linux下的Makefile和Windows下的类似,只是编译器不同而己,另外,生成的文件名为:helloworld.so,而不是helloworld.pyd 测试: >>>import helloworld >>>helloworld.SayHello() hello,world (完) 本文示例下载
相关文章推荐
- Fib数列问题2
- 如何发挥协调战斗能力
- 学习笔记五:Ubuntu下载编译Android源码
- Android 学习杂记
- php程序开发该怎么学,作为过来人的几点建议!
- 黑马程序员------- 网络编程-------
- 数列
- Sky Box
- ajax 基础学习
- 小强的HTML5移动开发之路(16)——神奇的拖放功能
- 小强的HTML5移动开发之路(16)——神奇的拖放功能
- 明明的随机数
- 利用mutt发外部邮件
- 程序员常用网站
- 【JPA 级联保存/级联删除】@OneToMany (双向) 一对多
- 路由器原理及路由协议
- Equals 和 == 的区别
- Debian安装php
- 字符大小写转换
- 将android sqlite数据表导出,然后找到了导出xls文件的方法