c与python交互

上传人:第*** 文档编号:61700641 上传时间:2018-12-10 格式:DOCX 页数:14 大小:34.78KB
返回 下载 相关 举报
c与python交互_第1页
第1页 / 共14页
c与python交互_第2页
第2页 / 共14页
c与python交互_第3页
第3页 / 共14页
c与python交互_第4页
第4页 / 共14页
c与python交互_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《c与python交互》由会员分享,可在线阅读,更多相关《c与python交互(14页珍藏版)》请在金锄头文库上搜索。

1、C语言与Python交互大夏天编辑整理于互联网,2017Pyton和C分别有着各自的优缺点,用Python开发程序速度快,可靠性高,并且有许多高级模块可供使用,但执行速度相对较慢;C语言则正好相反,执行速度快,但开发效率低。为了利用两种语言各自的优点,比较好的做法是用Python开发整个软件框架,而用C语言实现高效功能模块。本文介绍C与Python互相调用与结合的方法,第二部分介绍常用Python接口,第三部分介绍Python调用C程序,第四部分介绍C调用Python程序 一、简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因

2、如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中。 与其它普通脚本语言有所不同,Python程序员可以借助Python语言提供的API,使用C或者C+来对Python进行功能性扩展,从而即可以利用Python方便灵活的语法和功能,又可以获得与C或者C+几乎相同的执行性能。执行速度慢是几乎所有脚本语言都具有的共性,也是倍受人们指责的一个重要因素,Python则通过与C语言的有机结合巧妙地解决了这一问题,从而使脚本语言的应用范围得到了很大扩展。 在用Python开发实际软件系统时,很多时候都需要使用C/C+来对Python进行扩展。最常见的情况是目

3、前已经存在一个用C编写的库,需要在Python语言中使用该库的某些功能,此时就可以借助Python提供的扩展功能来实现。此外,由于Python从本质上讲还是一种脚本语言,某些功能用Python实现可能很难满足实际软件系统对执行效率的要求,此时也可以借助Python提供的扩展功能,将这些关键代码段用C或者C+实现,从而提供程序的执行性能。 本文主要介绍Python提供的C语言扩展接口,以及如何使用这些接口和C/C+语言来对Python进行功能性扩展,并辅以具体的实例讲述如何实现Python的功能扩展。 二、Python的C语言接口 Python是用C语言实现的一种脚本语言,本身具有优良的开放性和

4、可扩展性,并提供了方便灵活的应用程序接口(API),从而使得C/C+程序员能够在各个级别上对Python解释器的功能进行扩展。在使用C/C+对Python进行功能扩展之前,必须首先掌握Python解释所提供的C语言接口。 2.1 Python对象(PyObject) Python是一门面向对象的脚本语言,所有的对象在Python解释器中都被表示成PyObject,PyObject结构包含Python对象的所有成员指针,并且对Python对象的类型信息和引用计数进行维护。在进行Python的扩展编程时,一旦要在C或者C+中对Python对象进行处理,就意味着要维护一个PyObject结构。 在P

5、ython的C语言扩展接口中,大部分函数都有一个或者多个参数为PyObject指针类型,并且返回值也大都为PyObject指针。 2.2 引用计数 为了简化内存管理,Python通过引用计数机制实现了自动的垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象。 下面的例子说明了Python解释器如何利用引用计数来对Pyhon对象进行管理:例1:refcount.pyclass refcoun

6、t: # etc.r1 = refcount() # 引用计数为1r2 = r1 # 引用计数为2del(r1) # 引用计数为1del(r2) # 引用计数为0,删除对象在C/C+中处理Python对象时,对引用计数进行正确的维护是一个关键问题,处理不好将很容易产生内存泄漏。Python的C语言接口提供了一些宏来对引用计数进行维护,最常见的是用Py_INCREF()来增加使Python对象的引用计数增1,用Py_DECREF()来使Python对象的引用计数减1。 2.3 数据类型 Python定义了六种数据类型:整型、浮点型、字符串、元组、列表和字典,在使用C语言对Python进行功能扩展

7、时,首先要了解如何在C和Python的数据类型间进行转化。 2.3.1 整型、浮点型和字符串 在Python的C语言扩展中要用到整型、浮点型和字符串这三种数据类型时相对比较简单,只需要知道如何生成和维护它们就可以了。下面的例子给出了如何在C语言中使用Python的这三种数据类型:例2:typeifs.c/ build an integerPyObject* pInt = Py_BuildValue(i, 2003);assert(PyInt_Check(pInt);int i = PyInt_AsLong(pInt);Py_DECREF(pInt);/ build a floatPyObjec

8、t* pFloat = Py_BuildValue(f, 3.14f);assert(PyFloat_Check(pFloat);float f = PyFloat_AsDouble(pFloat);Py_DECREF(pFloat);/ build a stringPyObject* pString = Py_BuildValue(s, Python);assert(PyString_Check(pString);int nLen = PyString_Size(pString);char* s = PyString_AsString(pString);Py_DECREF(pString);

9、2.3.2 元组 Python语言中的元组是一个长度固定的数组,当Python解释器调用C语言扩展中的方法时,所有非关键字(non-keyword)参数都以元组方式进行传递。下面的例子示范了如何在C语言中使用Python的元组类型:例3:typetuple.c/ create the tuplePyObject* pTuple = PyTuple_New(3);assert(PyTuple_Check(pTuple);assert(PyTuple_Size(pTuple) = 3);/ set the itemPyTuple_SetItem(pTuple, 0, Py_BuildValue(i

10、, 2003);PyTuple_SetItem(pTuple, 1, Py_BuildValue(f, 3.14f);PyTuple_SetItem(pTuple, 2, Py_BuildValue(s, Python);/ parse tuple itemsint i;float f;char *s;if (!PyArg_ParseTuple(pTuple, ifs, &i, &f, &s) PyErr_SetString(PyExc_TypeError, invalid parameter);/ cleanupPy_DECREF(pTuple);2.3.3 列表 Python语言中的列表是

11、一个长度可变的数组,列表比元组更为灵活,使用列表可以对其存储的Python对象进行随机访问。下面的例子示范了如何在C语言中使用Python的列表类型:例4:typelist.c/create the listPyObject* pList = PyList_New(3); /new referenceassert(PyList_Check(pList);/set some initial valuesfor(int i = 0; i 3; +i) PyList_SetItem(pList, i, Py_BuildValue(i, i);/insert an itemPyList_Insert(

12、pList, 2, Py_BuildValue(s, inserted);/append an itemPyList_Append(pList, Py_BuildValue(s, appended);/sort the listPyList_Sort(pList);/reverse the listPyList_Reverse(pList);/fetch and manipulate a list slicePyObject* pSlice=PyList_GetSlice(pList,2,4); /new referencefor(int j = 0; j PyList_Size(pSlice

13、); +j) PyObject *pValue = PyList_GetItem(pList, j); assert(pValue);Py_DECREF(pSlice);/cleanupPy_DECREF(pList);2.3.4 字典 Python语言中的字典是一个根据关键字进行访问的数据类型。下面的例子示范了如何在C语言中使用Python的字典类型:例5:typedic.c/create the dictionaryPyObject* pDict = PyDict_New(); /new referenceassert(PyDict_Check(pDict);/add a few name

14、d valuesPyDict_SetItemString(pDict, first, Py_BuildValue(i, 2003);PyDict_SetItemString(pDict, second, Py_BuildValue(f, 3.14f);/enumerate all named valuesPyObject* pKeys = PyDict_Keys(pDict); /new referencefor(int i = 0; i PyList_Size(pKeys); +i) PyObject *pKey = PyList_GetItem(pKeys, i); PyObject *p

15、Value = PyDict_GetItem(pDict, pKey); assert(pValue);Py_DECREF(pKeys);/remove a named valuePyDict_DelItemString(pDict, second);/cleanupPy_DECREF(pDict);2.4 程序交互接口1.void Py_Initialize( ) 初始化Python解释器,在C+程序中使用其它Python/C API之前,必须调用此函数,如果调用失败,将产生一个致命的错误。2. int PyRun_SimpleString( const char *command) 执行一段Python

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号