Python 扩展(python 扩展函数)

日期:03-17

大家好,给大家分享一下。很多人不知道python扩展(Python扩展函数)。下面详细解释一下。现在让我们来看看!

1.1.python扩展的C代码写在哪里?

你可以在任何地方写它。重要的是编译过程。

告诉你编译过程。在windows和linux下,C扩展的编译方法是不同的。我们先来看看windows版本。

我们用C实现一个简单的加法。首先,用下面的代码创建一个新文件add . c:# include;静态PyObject* add(PyObject *self,py object * args);//必须声明为static,将它们限制在此文件的范围内。

几乎所有的参数都是PyObject类型。在python中,一切都是对象。静态PyObject* add(PyObject* self,py object * args){ int x = 0;int y = 0;int z = 0;如果(!PyArg_ParseTuple(args," i|i ",&x,&y))返回NULL/*第一个参数是self,这个是python用的。每个函数都必须有。

我们暂时不在乎。Args是参数列表。

她把所有的参数整合成一串。所以我们需要从这个字符串中解析我们的参数。

PyArg_ParseTuple完成此任务。第一个参数是args,这是我们要转换的参数。

二是格式符号。“S”代表一个字符串。

为从args中提取的一个参数编写“s ”,为两个参数编写“s|s ”,为一个string和一个int编写“s|i ”,类似于printf。第三个参数是放置提取参数的实际位置。

必须传递该参数的地址。对于add,他将提取两个参数。

分别是x和y。*/z = x y;返回Py_BuildValue("i ",z);/*我们需要在调用后返回结果。

这个结果就是C的类型或者是我们自己定义的类型。你必须把它转换成PyObject并让python知道它。

用这个Py_BuildValue来做。他是PyArg_ParseTuple的逆过程。

他的第一个参数与PyArg_ParseTuple的第二个参数相同,后者是一个格式化符号。第三个参数是我们需要转换的参数。

Py_BuildValue将把所有的返回集合成python的一个tutple。*/ }静态PyMethodDef addMethods[] = { {"add ",add,METH_VARARGS,"执行shell命令。"},{NULL,NULL,0,NULL } }/*这是一个C结构。

他是来完成地图绘制的。我们需要将所有的扩展函数映射到这个表中。

表的第一个字段是真正被python识别的。这是python中一个方法的名字。

第二个字段是这个方法名在python中的具体实现的函数名。在python中,当你调用add时,你真正做的是用c写的add函数。

第三个字段是METH_VARARGS,它告诉python,add是通过调用C函数实现的。第四个字段是该功能的描述。

如果在python中帮助这个函数,就会显示这个描述。相当于python中函数的文档。

*/PyMODINIT _ FUNC init add(){ Py _ init module(" add ",add methods);}/*注意这个函数的名字是不能改的。必须是init 模块名。

我们的模块名是add。所以这个函数是initadd()。

这样python就会在导入add的模块时找到这个函数并调用它。这个函数调用Py_InitModule将模块名与映射表结合起来。

他说add模块使用映射表addMethods。Python应该导入我们模块的。*/创建一个包含以下内容的新setup.py:从distrutils.core导入setup,extension module 1 = extension(' add '),Sources =[' add . c '])setup(name = ' package name ',version =' 1.0 ',description = '这是一个演示包',ext _ modules = [module 1]) Build:(指定mingw32是因为mingw安装在我的机器上。

默认编译器是vs2008。参考:python setup . py build-compiler = mingw 32执行后会在当前目录下生成一个构建目录和文件:build\lib.win32-2.6\add.pyd将add.pyd复制到当前目录下,用下面的代码写一个测试文件test . py:import add print add . add(3,4)。执行它并输出它。

在linux下,会有一点区别。也就是add.c直接编译成。所以用makefile,所以,python可以直接导入。makefile代码如下:pylib =/usr/binpyinc =/usr/include/python 2.6 all:add . c gcc add . c-g-I $(pyinc)-shared-l $(pylib)-lpython 2.6-o add . so clean:RM-f add . so使用同

2.2.python怎么可能是C语言的扩展?

Python是一种面向对象的解释性计算机编程语言,由荷兰人吉多·范·罗苏姆于1989年发明。第一次公开发布是在1991年。

Python是纯自由软件,源代码和解释器CPython遵循GPL(GNU通用公共许可)协议[1]。Python的语法简洁明了,它的一个特点就是强制使用空空格作为语句的缩进。

Python拥有丰富而强大的库。常被戏称为glue language,可以轻松连接其他语言(尤其是C/C )制作的各种模块。

常见的应用场景是用Python快速生成程序的原型(有时甚至是程序的最终界面),然后用更合适的语言重写[2]中有特殊要求的部分,比如3D游戏中的图形渲染模块。如果性能要求特别高,可以用C/C 重写,然后封装成Python可以调用的扩展类库。需要注意的是,使用扩展类库时可能需要考虑平台问题,有些可能不提供跨平台实现。

在python中扩展C语言模块可以总结为以下几个步骤:1 .首先写一个包含py接口的C源文件,名为wrap.c这一步可以由swig来进行。

比如:swig -python foo.i2接下来,编译wrap.c生成XX .所以这一步可以通过使用distutils来进行。

如果要使用distutils,需要先写一个py脚本。示例:setup (name =' example ',version =' 1.0 ',ext _ modules =[extension(' example ',['wrap.c ',' example.c']])注意:一个句子中的列表不仅要包含wrap源文件,还要包含函数的原始源文件。3.上一步中的so文件是可以使用的最终库文件。把这个文件放到py的lib或者当前目录下,就可以导入到C语言扩展模块中使用了。

如果以前使用过swig,将相应的so文件移动到模块文件夹中,并在文件名前添加\例如:cpprintf.so/usr/lib64/python 2.7/site-packages/_ printf . so

3.如何用python写一个可扩展更新的exe程序

1.手动制作python的exe可执行程序。Python没有内置编译为exe的功能。给python程序的部署带来了很多麻烦。所以会有一些像py2exe这样非常好的工具,用来自动编译。将文件复制到。exe文件。

最近我空研究了如何手动实现类似py2exe的函数,希望加强对python的理解。结果挺好的。把结果记录下来,分享给大家。

1.1.本文描述的方法基于python的以下功能。

Python程序运行时,会在sys.path指定的路径下寻找库文件

2) python从2.3开始,支持从zip文件导入库(。py,。pyc和。pyo受支持,但是。不支持pyd)

3) python提供了C API,让C语言的程序可以轻松调用python程序。

1.2.实用步骤注意:假设python安装在c:\python25目录下,最后一个可执行文件放在d:\dist目录下。

1)先转到c:\python25\Lib目录,将所有文件复制到d:\pythonlib目录等。

4.c语言扩展4。计算机编程语言

C-Python,或CPython,是指用C实现的Python虚拟机的基本API,最常见的Python是基于C实现的,其底层API称为C-Python API。所有的Python代码最终都会变成这些API和数据结构的调用,这就让Python的世界变得精彩起来。

Cython,准确的说,Cython是一种独立的语言,专门用来编写Python中导入的扩展库。实际上,Cython的语法和Python基本相同,Cython有一个特殊的“编译器”,它首先将Cython代码转换成C(自动添加了大量C-Python API),然后使用C编译器编译最终的Python-callable模块。

GIL:全局解释器锁,是Python虚拟机多线程机制的核心机制,翻译过来就是:全局解释器锁。其实Python线程是操作系统级的线程,在不同的平台上有不同的底层实现(比如win32 _ Thread for Win,pthread for POSIX等。).为了让所有对象的操作都是线程安全的,Python解释器使用了一个全局锁(GIL)来同步所有线程,造成了“一次只运行一个Python线程”的伪线程假象。GIL是一个非常细粒度的锁,多年来它的实现和性能问题一直备受争议,但今天它经受住了考验,即使它让Python在多核平台下的CPU没有得到最大限度的发挥。

5.如何添加自己的python脚本?

一种方式是直接放在项目里,但是不能共享。每次创建新项目,都要把代码放进去。

建议使用以下方法:

1.把常用文件放在一起。

比如~/python/common

模块utils.py,放在这里:~/python/common/utils.py

2.将它包含在新项目中,如下所示:

导入实用程序

3.在运行您的脚本之前,您必须添加环境变量,否则您无法找到包的位置:

导出PYTHONPATH=~/python/common

这个环境变量也可以写在/etc/profile中,避免每次都导出。

另一种方法是使用setuptools制作安装包。第三方包都用这种方式。但是对于正在开发和调试的库来说会很不方便。

希望能帮到你!

6.学习python语法后如何写作

Python程序员的学习路线图python 数据结构与算法 Linux 软件工程 web开发 git版本控制 沟通技巧等等。

Python(英文发音:/paθ n/)是一种面向对象的解释性计算机编程语言,由吉多·范·罗苏姆于1989年发明,1991年发布了第一个公开版本。

Python是纯自由软件,源代码和解释器CPython遵循GPL(GNU通用公共许可)协议。

Python的语法简洁明了,它的一个特点就是强制使用空空格作为语句的缩进。

Python拥有丰富而强大的库。常被戏称为glue language,可以轻松连接其他语言(尤其是C/C )制作的各种模块。常见的应用场景是用Python快速生成程序的原型(有时甚至是程序的最终界面),然后用更合适的语言重写有特殊要求的部分,比如3D游戏中的图形渲染模块。如果性能要求特别高,可以用C/C 重写,然后封装成Python可以调用的扩展类库。需要注意的是,使用扩展类库时可能需要考虑平台问题,有些可能不提供跨平台实现。

上面解释了python扩展(Python扩展函数)。这篇文章已经分享到这里了。希望能帮到大家。如果信息中有任何错误,请联系边肖进行更正。

标签: 编程语言 python python函数

0.046622s