1.Python与C交互概述
Python与C/C++交互的三种方式
- Python扩展:在Python程序中调用C/C++编写的库
- Python嵌入:在C/C++程序中调用Python程序
- Python调用:Python和C间以程序级别互相调用
Python与C/C++交互的价值
- 整合Python高产与C/C++高效的优势
- 利用C或Python已有功能服务彼此的程序
- Python作为粘性脚本语言整合或被整合到各类独立程序
Python扩展:在Python程序中调用C/C++编写的库
- 目的:提升关键代码性能、引入C语言成熟功能库
- 方式:Cython、SWIG、ctypes、CFFI
- 形式:Python为主程序,C通过.dll/.so形式使用
Python嵌入:在C/C++程序中调用Python程序
- 目的:利用Python高产、引入Python成熟功能库
- 方式:Python/C API
- 形式:C/C++为主程序,Python通过源文件形式使用
Python调用:Python和C间以程序级别互相调用
- 目的:模块间功能互用,以功能使用为目标
- 方式:子进程或线程方式,即subprocess
- 形式:C/C++和Python都是独立程序
小结:Python与C/C++交互的三种方式
- Python扩展:十分重要,Python程序员必学必会
- Python嵌入:一般重要,Python程序员可以掌握
- Python调用:比较重要,Python程序员应该掌握
2.Python的扩展方法
- 目的:提升关键代码性能、引入C语言成熟功能库
- 方式:Cython、SWIG、ctypes、CFFI
- 形式:Python为主程序,C通过.dll/.so形式使用
Cython:实现Python扩展的一种语言,第三方库
- 思路:通过一种简单的语言来实现Python和C的接口
- 方式:采用了Pyrex语法形式
- 结果:采用C数据类型的Python编程,实现混合编程
C语言官方:http://cython.org/
SWIG:一个将C/C++与脚本语言相整合的编译器,独立工具
- 思路:通过一个编译器来实现Python和C的接口
- 方式:纯C/C++编程,通过编写接口变成Python模块
- 结果:独立C和Python编程,重点在于编写接口(描述)
SWIG官方:www.swig.org
ctypes:调用DLL或共享库的Python功能函数库,标准库API
- 思路:通过一个Python标准库实现Python扩展
- 方式:C语言功能编为.dll或.so库,加载库及调用函数,API
- 结果:C语言独立编程,Python使用库调用接口函数
ctypes官方:https://docs/python/org/3.7/library/ctypes.html
CFFI:在Python中直接使用C函数的方式,第三方库
- 思路:类似ctypes,使用API扩展C程序,也可以直接混合编程
- 方式:关注C函数的访问接口,而不是库函数,构建API
- 结果:C语言独立编程,Python用CFFI扩展,最小学习代价
CFFI官网:https://cffi.readthedocs.io/
小结:在Python程序中调用C/C++编写的库
- Cython:采用C数据类型的Python编程
- SWIG:将C转变为Python模块的接口编译工具
- ctypes:调用.dll或.so的标准库API
- CFFI:调用C函数及混合编程的第三方库API
3.Python的嵌入方法
Python嵌入:在C/C++程序中调用Python程序
- 目的:利用Python高产、引入Python成熟功能库
- 方式:Python/C API
- 形式:C/C++ 为主程序,Python通过源文件形式使用
Python/C API:Python嵌入的主要接口
- 嵌入Python语句:嵌入一个或多个Python语句
- 嵌入Python脚本:嵌入一个或多个Python文件
- Python/C API需要加载Python解释器及加载Python语句和脚本
Python/C API:Python嵌入的主要接口
- Python/C API 是一组能够在C语言下执行的类型定义和函数
- 头文件:Python.h
- 函数:加载Python解释器、嵌入Python语句及脚本、数据类型转换等
加载Python解释器:
4.Python的调用方法
Python调用:Python和C间以程序级别互相调用
- 目的:模块间功能互用,以功能使用为目标
- 方式:子进程或线程方式,即subprocess
- 形式:C/C++和Python都是独立程序
在Python中调用C语言程序
- 使用Python的subprocess模块
- 步骤1:准备好C语言编写的待调用程序
- 步骤2:使用subprocess模块调用并执行程序
subprocess模块
在C中调用Python程序
- 使用C的system()函数
- 步骤1:准备好Python编写的待调用程序
- 步骤2:使用system()函数调用并执行程序
system()函数
小结:Python和C间以程序级别互相调用
- Python调用C :subprocess模块
- C调用Python:system()函数