Pyton和C分别有着各自的优缺点,用Python开发程序速度快,可靠性高,并且有许多高级模块可供使用,但执行速度相对较慢;C语言则正好相反,执行速度快,但开发效率低。为了利用两种语言各自的优点,比较好的做法是用Python开发整个软件框架,而用C语言实现高效功能模块。

一、简介

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语言接口

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

2.1 Python对象(PyObject)

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

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

2.2 引用计数

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

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

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

2.3 数据类型

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

2.3.1 整型、浮点型和字符串

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

2.3.2 元组

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

2.3.3 列表

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

2.3.4 字典

Python语言中的字典是一个根据关键字进行访问的数据类型。下面的例子示范了如何在C语言中使用Python的字典类型:

2.4 程序交互接口

1.void Py_Initialize( )

初始化Python解释器,在C 程序中使用其它Python/C API之前,必须调用此函数,如果调用失败,将产生一个致命的错误。

2. int PyRun_SimpleString( const char *command)

执行一段Python代码,就好象是在__main__ 函数里面执行一样。例:

PyRun_SimpleString(

python常用api_常用的Python接口,C语言也挡不住Python的强大相关推荐

  1. 求助:新浪微博 Python API在使用statuses/show接口时请求参数id与python内置函数id之间的冲突

    根据开发文档,statuses/show的介绍如下: 需求的请求参数是access_token和id 但是由于在Python IDE中,python作为内置函数名会和参数变量名冲突 可以看见id在Py ...

  2. 为什么 Python被Google选为TensorFlow的开发语言呢?使用 Python比C++语言进行机器学习有什么优势?

    其实TensorFlow大部分内核并不是用Python编写的 :它是高度优化了C++和CUDA(Nvidia用于编程GPU的语言)的组合. 相反,通常它是使用了Eigen (高性能C ++和CUDA库 ...

  3. 如何将C++代码封装成C模块,适配Python、Lua和C++调用。多种语言(C++、python和lua)调用C++封装的看门狗sdk模块

    概述 示例程序仓库路径:https://gitee.com/liudegui/test_dogservice 示例程序是对看门狗模块的封装,已在windows平台测试,代码理论上可直接支持Linux平 ...

  4. python培训机构哪家靠谱_好程序员告诉你Python机构哪家比较靠谱

    原标题:好程序员告诉你Python机构哪家比较靠谱 诚如大家所知,Python语言的就业方向多样,大体上可以划分为:Linux运维.Python自动化测试.Python全栈工程师.数据分析.人工智能等 ...

  5. 数据科学 | Python数据科学常用库

    Python 在解决数据科学任务和挑战方面继续处于领先地位. 目录 核心库 IPython NumPy SciPy Pandas StatsModels 可视化 Matplotlib Seaborn ...

  6. python第三方库有哪些常用的、请列举15个-你想要的Python面试都在这里了【315+道题】...

    第一部分 Python基础篇(80题) 1.为什么学习Python? 1.python是脚本语言,作为程序员至少应该掌握一本通用脚本语言,因为脚本语言与编译语言的开发测试过程不同,可以极大的提高编程效 ...

  7. python第三方库排行-Python模块汇总(常用第三方库)

    模块 定义 计算机在开发过程中,代码越写越多,也就越难以维护,所以为了编写可维护的代码,我们会把函数进行分组,放在不同的文件里.在python里,一个.py文件就是一个模块 优点: 提高代码的可维护性 ...

  8. python 魔法方法常用_Python魔法方法指南

    有很多人说学习Python基础之后不知道干什么,不管你是从w3c还是从廖雪峰的教程学习的,这些教程都有一个特点:只能引你快速入门,但是有关于Python的很多基础内容这些教程中都没介绍,而这些你没学习 ...

  9. python图形化方式模块安装_(怎么安装python模块,如何安装python模块,常用安装方式)python助手安装教程视频...

    有没有比较好的python3的入门视频教程,网盘或网站都可以. 我这里有Python,开发,进阶,自动化,实战列视频教程,还有安装包,,代码等容,这里就不一一说了,全套内容一共300G左右,非常的详细 ...

最新文章

  1. linux上使用FTP下载文件
  2. springbot集成finereport后在web中使用iframe引用报表
  3. 动态代理,动态代理设计模式 ,JDK动态代理,cglib动态代理
  4. Android插件化开发之运行未安装apk的activity
  5. 使用Spring Boot和Project Reactor处理SQS消息-第2部分
  6. 37职责链模式(Chain of Responsibility Pattern)
  7. asp.net中ADO.NET连接SQL数据库代码和连接Access数据库代码
  8. Mac Nginx 配置 Tomcat 配置 jdk环境变量 Nginx部署服务遇到的坑(3)
  9. vuejs知乎_你也许不知道的Vuejs - 深入浅出响应式系统
  10. 【汇编语言/底层开发】9、转移指令的原理
  11. php海思hi3531d,海思hi3531DV200 h.265编解码AI处理器
  12. 破解Access(*.mdb)目前所有版本的密码
  13. DirectX12(D3D12)基础教程(十)——DXR(DirectX Raytracing)基础教程(上)
  14. 程序员5大热门发展行业,就业迷茫的同学注意啦!
  15. 【Day2.4】在华欣葡萄酒庄园午餐,风景也值这个价钱
  16. 【Mysql】Mysql GTID复制进程出现异常,出现断点
  17. 针对Linux系统主机,进入修复模式,解决开机报错问题
  18. echarts 百度地图统计分布图,地图可视化统计
  19. 我参加NVIDIA Sky Hackathon(语音识别模型训练)
  20. python数据分析实战之信用卡违约风险预测

热门文章

  1. python学习笔记之类和对象
  2. Python编程基础之Python语言的输入输出
  3. 通过开户银行账号查询客商名称 sql
  4. 程序员与年龄:人到中年不得已!程序员到了三四十岁该怎么办?
  5. 解决Angular HttpClient设置headers后,Body体格式问题
  6. 一根飞线的故事-SVG篇
  7. 联璧金融崩盘!斐讯0元购抛弃合作伙伴求生,以后还能投资什么?
  8. JS控制下的双层Tab切换
  9. GitHub 上 4w+ Star 大佬的求职回忆
  10. maven报错:SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“. SLF4J: Defaulting to no-ope