python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中。

与其它普通脚本语言有所不同,Python程序员可以借助Python语言提供的API,使用C或者C++来对Python进行功能性扩展,从而即可以利用Python方便灵活的语法和功能,又可以获得与C或者C++几乎相同的执行性能。执行速度慢是几乎所有脚本语言都具有的共性,也是倍受人们指责的一个重要因素,Python则通过与C语言的有机结合巧妙地解决了这一问题,从而使脚本语言的应用范围得到了很大扩展。

在用Python开发实际软件系统时,很多时候都需要使用C/C++来对Python进行扩展。最常见的情况是目前已经存在一个用C编写的库,需要在Python语言中使用该库的某些功能,此时就可以借助Python提供的扩展功能来实现。此外,由于Python从本质上讲还是一种脚本语言,某些功能用Python实现可能很难满足实际软件系统对执行效率的要求,此时也可以借助Python提供的扩展功能,将这些关键代码段用C或者C++实现,从而提供程序的执行性能。

本文主要介绍Python提供的C语言扩展接口,以及如何使用这些接口和C/C++语言来对Python进行功能性扩展,并辅以具体的实例讲述如何实现Python的功能扩展。

1. Python的C语言接口

Python是用C语言实现的一种脚本语言,本身具有优良的开放性和可扩展性,并提供了方便灵活的应用程序接口(API),从而使得C/C++程序员能够在各个级别上对Python解释器的功能进行扩展。在使用C/C++对Python进行功能扩展之前,必须首先掌握Python解释所提供的C语言接口。

1.1 Python对象(PyObject)

Python是一门面向对象的脚本语言,所有的对象在Python解释器中都被表示成PyObject,PyObject结构包含Python对象的所有成员指针,并且对Python对象的类型信息和引用计数进行维护。在进行Python的扩展编程时,一旦要在C或者C++中对Python对象进行处理,就意味着要维护一个PyObject结构。

在Python的C语言扩展接口中,大部分函数都有一个或者多个参数为PyObject指针类型,并且返回值也大都为PyObject指针。

1.2 引用计数

为了简化内存管理,Python通过引用计数机制实现了自动的垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象。

下面的例子说明了Python解释器如何利用引用计数来对Pyhon对象进行管理:

在C/C++中处理Python对象时,对引用计数进行正确的维护是一个关键问题,处理不好将很容易产生内存泄漏。Python的C语言接口提供了一些宏来对引用计数进行维护,最常见的是用Py_INCREF()来增加使Python对象的引用计数增1,用Py_DECREF()来使Python对象的引用计数减1。

1.3 数据类型

Python定义了六种数据类型:整型、浮点型、字符串、元组、列表和字典,在使用C语言对Python进行功能扩展时,首先要了解如何在C和Python的数据类型间进行转化。

整型、浮点型和字符串

在Python的C语言扩展中要用到整型、浮点型和字符串这三种数据类型时相对比较简单,只需要知道如何生成和维护它们就可以了。下面的例子给出了如何在C语言中使用Python的这三种数据类型:

元组

Python语言中的元组是一个长度固定的数组,当Python解释器调用C语言扩展中的方法时,所有非关键字(non-keyword)参数都以元组方式进行传递。下面的例子示范了如何在C语言中使用Python的元组类型:

列表

Python语言中的列表是一个长度可变的数组,列表比元组更为灵活,使用列表可以对其存储的Python对象进行随机访问。下面的例子示范了如何在C语言中使用Python的列表类型:

Python

2. Python的C语言扩展

2.1 模块封装

在了解了Python的C语言接口后,就可以利用Python解释器提供的这些接口来编写Python的C语言扩展,假设有如下一个C语言函数:

Python

该函数的功能是计算某个给定自然数的阶乘,如果想在Python解释器中调用该函数,则应该首先将其实现为Python中的一个模块,这需要编写相应的封装接口,如下所示:

一个典型的Python扩展模块至少应该包含三个部分:导出函数、方法列表和初始化函数。

c语言api_用C语言来拓展python的功能相关推荐

  1. python语言是谁发明的咋读-Python简史

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python是我喜欢的语言,简洁,优美,容易使用.前两天,我很激昂的向朋友宣传Py ...

  2. a5 1c语言实现,初识C语言1_qq5fb3b05a5f322的技术博客_51CTO博客

    本章重点: 什么是C语言 第一个C语言程序 数据类型 变量.常量 字符串+转义字符+注释 选择语句 循环语句 函数 数组 操作符 常见关键字 define 定义常量和宏 指针 结构体 什么是C语言? ...

  3. go语言视频教程_ go语言入门视频教程_go语言实战视频教程

    许多人可能知道go语言的优点在哪里,但他们不知道go语言适合在哪里使用.通过学习go语言视频教程,可以清楚的知道go语言主要用于服务器端开发,其定位是用来开发"大型软件".学习go ...

  4. c语言教学方法措施,C语言教学方法探讨

    袁玉英 罗永刚 摘要:为了改进C语言教学的效果,根据多年的教学和实践经验,提出在C语言教学中出现的问题,并对每个问题,提出合理的建议,以促进C语言教学的改革.实践证明,这些措施对提高学生学习C语言的兴 ...

  5. c程序语言难么,c语言难不难

    计算机二级考试听说不是很难,但是计算机二级考试c语言难不难大部分同学就不太清楚了.下面是由出国留学网小编为大家整理的"计算机二级考试c语言难不难",仅供参考,欢迎大家阅读. 计算机 ...

  6. 【C语言学习】C语言初探

    第一个C语言程序 #include <stdio.h>int main() {// puts 是 output string 的缩写,即在控制台输出字符串puts("Hello, ...

  7. 聊城大学c语言实验报告,c语言程序设计(包云)c第1章概述.ppt

    c语言程序设计(包云)c第1章概述.ppt C语言程序设计,讲授包云 单位聊城大学计算机学院,第1章 C语言概述,3,主要内容,1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C语言的发展 ...

  8. 什么是编程语言C语言,什么是oc语言,oc语言是c语言吗?

    作为一个ObjecTIve-C的coder,我总能听到一部分人在这门语言上抱怨有很多问题.他们总在想快速学习这门语言来写一个App出来,但他们也总是联想到ObjecTIve-C看上去实在太难了或者在想 ...

  9. 【Golang】一篇文章带你快速了解Go语言为什么你要学习Go语言

    目录 1. 为什么互联网世界需要Go语言 1.1 硬件限制:摩尔定律已然失效 1.2 Go语言为并发而生 1.3 Go性能强悍 1.4 Go语言简单易学 1.4.1 语法简洁 1.4.2 代码风格统一 ...

最新文章

  1. 非阻塞socket的连接
  2. VS2010 无法调试、断点 的解决方法
  3. python 文本框内容变化_jquery文本框内容改变事件
  4. 使用异步 I/O 大大提高应用程序的性能
  5. face alignment by 3000 fps系列学习总结
  6. react(95)--外部定义变量
  7. 工作134:custom组件
  8. JVM知识(三):内存模型和可见性
  9. IE 不支持单引号(')的实体名称(amp;apos;)
  10. Swift和R3联手了,跨境支付市场竞争升级
  11. Unity VideoPlayer 播放视频
  12. Kettle数据库连接中的集群与分片
  13. 一个玩游戏的失足青年,转行做游戏开发到教育的挣扎过程(3)
  14. 健康常识坚持用柠檬的好处(适量)
  15. mac 我用Mac的这一年
  16. WEB漏洞之:海洋CMS代码执行(CNVD-2020-22721)
  17. [POI2007]TET-Tetris Attack
  18. 电脑组成部件介绍图解:电脑的硬件组成部分及其作用各是什么?
  19. VRRP和DHCP的设置
  20. 苹果手机来电归属地_工信部 : 暂未出台取消手机号码归属地政策!

热门文章

  1. 云栖专辑 | 阿里开发者们的第6个感悟:享受折磨 1
  2. Redis 巧用数据类型实现亿级数据统计
  3. java jndi使用_Java项目中使用JNDI连接数据库
  4. mysql外键约束分数_MySQL提高(外键约束)
  5. 企业微信H5_网页jssdk调用 config和agentconfig的区别
  6. ElasticSearch 索引基本操作_04
  7. Docker JFrog Artifactory 7.27.10 maven私服(IDEA 实战篇01) linux
  8. RuoYi-Cloud 部署篇_03(windows环境 mysql版本)
  9. Beetl 模板引擎学习
  10. Launch failed - cleaning up connection