怎么写python扩展( 二 )


2.python怎么作为c语言的扩展Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年 。
Python是纯粹的自由软件,源代码和解释器CPython遵循 GPL(GNU General Public License)协议[1]。Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进 。
Python具有丰富和强大的库 。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起 。
常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中[2] 有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库 。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现 。
在python中扩展c语言模块可以总结为以下几步:1.首先,编写包含py接口的c源文件,称为wrap.c 。这一步可以使用swig带过 。
例如:swig -python foo.i2.接着,对wrap.c进行编译,生成XX.so 。这一步可以使用 distutils带过 。
如果要用 distutils的话,则需要首先编写一个py脚本 。示例:setup(name = 'example', version = '1.0', ext_modules = [Extension('example', ['wrap.c','example.c'])]) 注意:句子中的list不仅不要包含wrap源文件,还要包含函数的原始源文件3.上一步的so文件便是最终可以使用的库文件,把该文件放入py的lib中或者当前目录,即可导入c语言扩展模块进行使用 。
如果之前用过swig,还要把相应的so文件移入模块文件夹中并在文件名前加上_ 。示例: cp printf.so /usr/lib64/python2.7/site-packages/_printf.so 。
3.怎样用python编写一个可扩展更新的exe程序1. 手动制作python的exe可执行程序Python没有内建一个编译为exe的功能 。给python程序的部署带来不少的麻烦 。所以就会出现一些py2exe之类的很不错的工具,用于自动把.py文件编译为.exe文件 。
最近抽空研究了一下手动实现类似py2exe的功能,希望加强对python的了解 。结果还相当不错 。把结果记录下来,与大家共享 。
1.1. 原理文中所描述的方法,基于python的以下几个功能
1) python程序运行时,会在sys.path指定的路径中查找库文件 。
2) python从2.3开始,支持从zip文件中import库(支持.py,.pyc和.pyo,但不支持.pyd)
3) python提供C API,让c语言的程序,可以很方便的调用python的程序
1.2. 实际步骤注:假设python安装在c:\python25目录中,最后的可执行文件放到d:\dist目录中
1) 先去c:\python25\Lib目录,把所有文件都复制出来,比如复制到d:\pythonlib目录中
4.Python的C语言扩展C-Python,或者CPython,指C实现的Python虚拟机的基础API 。最通用的Python就是是基于C实现的,它的底层API称为C-Python API,所有Python代码的最终变成这些API以及数据结构的调用,才有了Python世界的精彩 。
Cython,准确说Cython是单独的一门语言,专门用来写在Python里面import用的扩展库 。实际上Cython的语法基本上跟Python一致,而Cython有专门的“编译器”先将 Cython代码转变成C(自动加入了一大堆的C-Python API),然后使用C编译器编译出最终的Python可调用的模块 。
GIL:Global Interpreter Lock,是Python虚拟机的多线程机制的核心机制,翻译为:全局解释器锁 。其实Python线程是操作系统级别的线程,在不同平台有不同的底层实现(如win下就用win32_thread, posix下就用pthread等),Python解释器为了使所有对象的操作是线程安全的,使用了一个全局锁(GIL)来同步所有的线程,所以造成“一个时刻只有一个Python线程运行”的伪线程假象 。GIL是个颗粒度很大的锁,它的实现跟性能问题多年来也引起过争议,但到今天它还是经受起了考验,即使它让Python在多核平台下CPU得不到最大发挥 。