pythonc扩展

1.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。

2.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得不到最大发挥。

3.python扩展的c代码在哪里写

在哪里写都可以啊,重要的是编译过程。

给你介绍下编译过程吧。在windows和linux下面,对C扩展的编译方法是不一样的,我们先来看windows版的。

我们用C实现一个简单的加法。首先新建一个文件add.c,代码如下:#include ; static PyObject* add(PyObject *self, PyObject *args); //一定声明为static,把他们限制在这个文件范围里。

几乎所有的参数都是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用同样的测试代码,可以测试通过。

4.如何编译C++文件为Python扩展模块

这个在python的帮助里就有。例子代码也完整。参考”Extending and Embedding the Python Interpreter“, 还有"Python/C API Reference Manual". 后面还有一段说明。

The API is equally usable from C++, but for brevity it is generally referred to

as the Python/C API。

不过有两个建议:

最好用C语言,而不是用C++。这主要是保持兼容性,方便使用ctypes, C++略复杂些。

另外就是建议你使用cython,这样挺容易就生成python 的ext,所以不用再为C++编译python ext发愁。

如果想在C++里调用python也容易。初始化一个interpreter,就和python一样用。通过返回变量获得结果。

另外C++与python程序数据交换还可以采用共享内存,其中有一个是基于numpy的共享内存方案挺成熟的。

5.如何使Python嵌入C++应用程序

Python容易扩展和嵌入。Python提供的许多标准模块支持C或者C++接口。Python和C可以一起工作,它可以嵌入到C或者C++的应用程序当中,因此可用Python语言为应用程序提供脚本接口,由于支持跨语言开发。

可用Python设计概念化应用程序,并逐步移植到C,使用前不必用C重写应用程序。(Jython使Python可以和Java一起工作,使开发者可以在Python里面调Java的包,也可以在Java里面使用Python的对象。还有更妙的,由于Jython的解释器完全用Java编写,因此可以在支持Java的任何平台上部署Python程序,甚至WEB浏览器也可以直接运行Python脚本。)

提出问题在某个C++应用程序中,我们用一组插件来实现一些具有统一接口的功能,我们使用Python来代替动态链接库形式的插件,这样可以方便地根据需求的变化改写脚本代码,而不是必须重新编译链接二进制的动态链接库。Python强大的功能足以胜任,但是有一些操作系统特定的功能需要用C++来实现,再由Python调用。所以,最基础地,我们需要做到:

1. 把Python嵌入到C++应用程序中,在C++程序中调用Python函数和获得变量的值;

2. 用C++为Python编写扩展模块(动态链接库),在Python程序中调用C++开发的扩展功能函数。

6.如何使Python嵌入C++应用程序

Python容易扩展和嵌入。

Python提供的许多标准模块支持C或者C++接口。Python和C可以一起工作,它可以嵌入到C或者C++的应用程序当中,因此可用Python语言为应用程序提供脚本接口,由于支持跨语言开发。

可用Python设计概念化应用程序,并逐步移植到C,使用前不必用C重写应用程序。(Jython使Python可以和Java一起工作,使开发者可以在Python里面调Java的包,也可以在Java里面使用Python的对象。

还有更妙的,由于Jython的解释器完全用Java编写,因此可以在支持Java的任何平台上部署Python程序,甚至WEB浏览器也可以直接运行Python脚本。)提出问题在某个C++应用程序中,我们用一组插件来实现一些具有统一接口的功能,我们使用Python来代替动态链接库形式的插件,这样可以方便地根据需求的变化改写脚本代码,而不是必须重新编译链接二进制的动态链接库。

Python强大的功能足以胜任,但是有一些操作系统特定的功能需要用C++来实现,再由Python调用。所以,最基础地,我们需要做到:1. 把Python嵌入到C++应用程序中,在C++程序中调用Python函数和获得变量的值; 2. 用C++为Python编写扩展模块(动态链接库),在Python程序中调用C++开发的扩展功能函数。

7.如何编译C++文件为Python扩展模块

这个在python的帮助里就有。

例子代码也完整。参考”Extending and Embedding the Python Interpreter“, 还有"Python/C API Reference Manual". 后面还有一段说明。

The API is equally usable from C++, but for brevity it is generally referred to as the Python/C API。不过有两个建议:最好用C语言,而不是用C++。

这主要是保持兼容性,方便使用ctypes, C++略复杂些。另外就是建议你使用cython,这样挺容易就生成python 的ext,所以不用再为C++编译python ext发愁。

如果想在C++里调用python也容易。初始化一个interpreter,就和python一样用。

通过返回变量获得结果。另外C++与python程序数据交换还可以采用共享内存,其中有一个是基于numpy的共享内存方案挺成熟的。

pythonc扩展

转载请注明出处代码入门网 » pythonc扩展

资讯

pythonhdfs

阅读(7)

本文主要为您介绍pythonhdfs,内容包括hdfspython到底怎么用,python访问hdfs,python访问hdfs。机器学习是一系列算法。这些算法通常需要大数据,大量的计算 。 hadoop是一种使用多台服务器稳定的进行大规模数据批量处理的软件框架。

资讯

python去除换行

阅读(10)

本文主要为您介绍python去除换行,内容包括python去除字符串列表中的换行符,python如何去除文本中的换行,python怎样去掉字符串后的换行符。Python中换行符为"\n";Python中操作换行符的函数为:replace("\n",""),替换函数;步骤:先判断读取文件,判断

资讯

python自然语言

阅读(8)

本文主要为您介绍python自然语言,内容包括PYTHON自然语言处理怎么样,用Python做自然语言理解方面的人多么,精通python自然语言处理怎么样。记得2007年上半年,最初读到这本书的时候还是草稿,用了整个一个暑假来仔细研究这本书,现在已经和以前的

资讯

pythonsort()函数

阅读(7)

本文主要为您介绍pythonsort()函数,内容包括pythonsort()用法,python怎么使用sort,Python里的sort语句。Python中的sort()方法用于数组排序,下面以实例形式对此加以详细说明:基本形式列表有自己的sort方法,其对列表进行原址排序,既

资讯

python的for遍历数组

阅读(9)

本文主要为您介绍python的for遍历数组,内容包括python怎么遍历一个数组,python用for循环筛选数组,python如何将for循环的结果写成一个数组。dataframe创建方法有很多,常用基本格式是:dataframe 构造器参数:dataframe(data=[],index=[],

资讯

pythoninstallmysql

阅读(8)

本文主要为您介绍pythoninstallmysql,内容包括如何安装MySQLpython,在python中怎样安装mysql,python中怎么安装setuotools。安装mysql首先到mysql官网下载文件:mysql-installer-community.msi 安装过程同一般exe文件,不再叙

资讯

dir()python

阅读(8)

本文主要为您介绍dir()python,内容包括python语言中的内建函数dir()是干啥用的啊,python的dir和help用法,python的dir和help用法。dir()dir([object]) -> list of stringsReturn an alphabetized list of

资讯

db2python

阅读(6)

本文主要为您介绍db2python,内容包括python如何连接DB2数据库,python怎么连接db2数据库,求助,请问各位高手如何实现从DB2远程将数据迁移到linux下的post。snip 的英文原意是削减,剪去的意思。在Python 中,snip 就是代表省略代码的意思,把前面

资讯

pythonmysql数据库

阅读(6)

本文主要为您介绍pythonmysql数据库,内容包括如何使用python连接mysql数据库,python怎么使用mysql数据库,python中怎么操作mysql数据库。你可以访问Python数据库接口及API查看详细的支持数据库列表。不同的数据库你需要下载不同的DB API模

资讯

pythontimer

阅读(8)

本文主要为您介绍pythontimer,内容包括怎么使用python的timer,怎么使用python的timer,python的timer在哪个模块。hreading Timer:# python3.3# coding: UTF-8import threadingdef PrintHe

资讯

python标准库中文

阅读(6)

本文主要为您介绍python标准库中文,内容包括Python常用的标准库以及第三方库,Python常用的标准库以及第三方库,python标准库。标库Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由

资讯

pythonsplit(函数

阅读(8)

本文主要为您介绍pythonsplit(函数,内容包括python中split的具体用法,Python字符串操作的split方法,python中split的具体用法。str.split()没有参数,代表以空字符分割,空字符包括空格、制表符、回车符、换行符等。因此,字符串中的空格和\n都是

资讯

pythonbreak

阅读(6)

本文主要为您介绍pythonbreak,内容包括python里的break语句啥意思,关于Python中break的用法,python里的break语句啥意思。像c语言中的goto,shell中的break 后面跟跳出层次的在方法在python中都没有,这可不是因为python设计的low,而是

资讯

unityforpython

阅读(1)

本文主要为您介绍unityforpython,内容包括Unity支持Python吗,unity3d不支持python吗,Python和unity游戏开发哪个就业好一点,前景很好。Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画

资讯

pythonclusterby

阅读(6)

本文主要为您介绍pythonclusterby,内容包括pythonsubplots是什么意思,pythonscipy怎么做层次聚类,udaf可以用python写吗。group和groups是两个不同的函数。一般,m.group(N) 返回第N组括号匹配的字符。而m.group() == m.grou

资讯

pythonclose

阅读(7)

本文主要为您介绍pythonclose,内容包括python中close的用法,为什么会出现attributeerror'str'objecthason,Python在打开文件后为什么要close(),如果不关有什么危害搜,python中涉及到文件的程序,为什么close函数是必须的。python 对

资讯

pythoncoding

阅读(3)

本文主要为您介绍pythoncoding,内容包括python中#coding:gbk有什么用,Pythoncoding用,SublimeText与Pycharm哪个更好,怎么在python加入#/usr/bin/envpythoncoding=utf8。它是一种编码格式,简单说明是:文件说明指令来确定不同的环境进行不同的

资讯

pythoncv安装

阅读(5)

本文主要为您介绍pythoncv安装,内容包括如何在OSX系统上安装Opencv3和Python2.7,ubutun下opencv3.0+python2.7安装完毕,打开python需要用什么命令吗,ubuntu系统怎么安装python版本的opencv。setp1安装CodeX,不解释,在AppStop中搜索安装即可se

资讯

pythonc混合编程

阅读(2)

本文主要为您介绍pythonc混合编程,内容包括python怎么和C或者C++混合编程,如何实现C与python混合编程,请教下python怎么和C或者C++混合编程。派桑和c/c++实际上是不同的工具,一个是斧头,一个是菜刀,各有各的用途。非要把让菜刀能砍柴,让斧头能

资讯

pythoncaffe

阅读(4)

本文主要为您介绍pythoncaffe,内容包括pythoncaffe怎么做测试,如何用python接口调用caffemodel,怎么才能让python2和python3同时都能调用caffe?。来表示整个运算过程的话,那么w和b就是我们需要训练的东西,w称为权值,在cnn中也可以叫做卷积核(fi

资讯

Pythoncsv处理

阅读(5)

本文主要为您介绍Pythoncsv处理,内容包括python中怎么处理csv文件,python中怎么处理csv文件,python对csv文件进行数据处理与统计。什么是CSV就是内容用逗号隔开,后缀是.csv的文件。它可以被任何一个文本编辑器打开。如果用excel打开,它又可以

资讯

pythoncsv格式

阅读(4)

本文主要为您介绍pythoncsv格式,内容包括python怎么读csv文件,csv文件怎么打开使用Python读取和写入CSV文件,pythoncsv写入的字符串是什么格式。csv文件本质上是一个文本文件,具体的读取和写入方法有两种:直接对csv文件进行文件读写操作,每一

资讯

毕业设计python

阅读(1)

本文主要为您介绍毕业设计python,内容包括用python做毕业设计,做个什么题目稍微容易一点,用Python做毕业设计选什么项目比较好,刚刚接触python,正好赶上毕设,想做python,由于是新手,所以想拜。首先你选择Python就很好,且不说Python本身很简

资讯

pythonlinux开发

阅读(1)

本文主要为您介绍pythonlinux开发,内容包括如何在linux下开发python程序,pycharm怎么开发linux程序,linux和python先学哪个。众所周知,系统管理员需要精通一门脚本语言,而且招聘机构列出的职位需求上也会这么写。大多数人会认为 Bash (或者其

资讯

python上海

阅读(1)

本文主要为您介绍python上海,内容包括上海python培训学费多少钱老男孩培训机构多少钱,想学习python,麻烦问一下上海哪家比较好一点的培训机构有这个课程,上海python就业前景是否值得期待。优点 门槛低,上手快; 2、比 R 更具有通用性和实用性

资讯

python程序运行时

阅读(1)

本文主要为您介绍python程序运行时,内容包括分析python程序运行时间的几种方法,python的程序怎么运行,如何运行Python程序。你在windows下根本不用这么麻烦: 首先,比如你的程序名字是 test.py 如果你想调用某个具体函数,就自己写一个的文件,比

资讯

python在线编译

阅读(1)

本文主要为您介绍python在线编译,内容包括python在线编译器哪个,求一个好的免费的Python编译器,最好是直接丢链接,谢谢大佬,什么软件可以编译Python。实际上python 是脚本语言解释执行的,并不存在编译这个概念。用python -m py_compile file

资讯

pythonascii字符

阅读(1)

本文主要为您介绍pythonascii字符,内容包括python判断纯ASCII字符串怎么做,如何使用Python获得一个字符的ASCII值,python怎么判断ascii字符串问题。如果要判断某路径是否包换中文,可以用正则表达式判断是否含有双字节字符>>> import re>>> r

资讯

python进程通信

阅读(1)

本文主要为您介绍python进程通信,内容包括python进程间通信怎么理解,python进程间通信怎么理解,python进程间通信怎么理解。在2.6才开始使用multiprocessing 是一个使用方法类似threading模块的进程模块。允许程序员做并行开发。并且可以在

资讯

eclipse运行python

阅读(1)

本文主要为您介绍eclipse运行python,内容包括如何在eclipse中运行python,如何在eclipse中运行python,怎么用eclipse打开python项目。下载python下载eclipse假设有上面两个,下载一个Python的Eclipse插件pydev下载完后将其解压到Eclipse的目

资讯

python类的self

阅读(1)

本文主要为您介绍python类的self,内容包括python怎么理解类和self的用法和含义,python怎么理解类和self的用法和含义,python中self是什么意思。python的class保留了语言在进化过程中的一些遗迹。对象这种概念,可以追溯到C语言中大量使用的结

资讯

数组长度python

阅读(1)

本文主要为您介绍数组长度python,内容包括python数组要先定义长度吗,python数组要先定义长度吗,python如何输入一个长度不定的数组。视情况而定如果你的数来组是追加一个元素的可以不用定义长度如果你初始化一个列自表然后要修改其中的值的