1.python扩展的c代码在哪里写
在哪里写都可以啊,重要的是编译过程。
给你介绍下编译过程吧。在windows和linux下面,对C扩展的编译方法是不一样的,我们先来看windows版的。
我们用C实现一个简单的加法。首先新建一个文件add.c,代码如下:#include
几乎所有的参数都是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,内容如下: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])组建:(由于我的机器上装了mingw,所以指定了mingw32。
默认的编译器是vs2008。参考:python setup.py build --compiler=mingw32 执行后会在当前目录生成一个build目录及文件:build\lib.win32-2.6\add.pyd 将add.pyd拷贝到当前目录,并写一个测试文件test.py,代码如下:import add print add.add(3,4) 执行一下,输出为7 OK,基本上就是如此了。
在linux下的话,会有少许不同.即直接用makefile将add.c编译成.so,python可以直接import,makefile代码如下:PYLIB = /usr/bin PYINC = /usr/include/python2.6 all: add.c gcc add.c -g -I$(PYINC) -shared -L$(PYLIB) -lpython2.6 -o add.so clean: rm -f add.so用同样的测试代码,可以测试通过。
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得不到最大发挥。
5.怎么添加自已写的python脚本
一种方法是直接放在项目里,但这样是不能做到公用的。你每新建一个项目,都要把代码放进去。
推荐下面的方法:
1、将公用的文件放在一起
如~/python/common
模块utils.py,放在这里:~/python/common/utils.py
2、在你的新项目里这样包含它:
import utils
3、在运行你的脚本前,要加环境变量才可以,否则找不到包的位置:
export PYTHONPATH=~/python/common
这个环境变量也可以写在/etc/profile里,避免每次都export
还有一种方法,就是使用setuptools制作安装包。第三方的包都是采用这种方式。但对于正在开发和调试的库,会比较不方便。
希望能帮到你!
6.学会python语法之后怎么写
python程序员学习路线图 python+ 数据结构和算法 + linux + 软件工程 + web开发 + git版本控制+ 沟通技巧等等。
Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。
Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议。
Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。
Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。
转载请注明出处育才学习网 » 怎么写python扩展