2023年7月10日发(作者:)
Python与cc++混合编程 Python时现在很⽕的⼀种语⾔,在云计算、⼈⼯智能、⾃动化测试等领域使⽤率⾮常⾼。之所以有这么⼤的市场使⽤率,python也是有它⾃⼰的独特之处,⾸先python易学,并且是⼀种解释性语⾔,不需要经过编译,并且它有着⾮常丰富的第三⽅库,可以帮助你处理各种⼯作,包括:电⼦邮件、数据库、web、GUI、单元测试等。Python采⽤强制缩进的⽅式使得代码有着极佳的可读性。 但python也有⾃⼰的缺点:就是运⾏速度,如果有速度要求的话,建议⽤c或c++改写关键部分,可以提⾼运⾏速度。 这样就会牵涉到混合编程的模式,即python如何调⽤使⽤c或c++实现的接⼝。 本⽂的主要⽬的就是介绍python与c/c++如何实现混合编程。
环境: Python3.5 vim ctypes swig3.0.8 centosctypes:python 可以通过使⽤ ctypes 模块调⽤ c 函数,这其中必定包括可以定义 c 的变量类型(包括结构体类型、指针类型)。官⽅给的定义是 “ctypes is a foreign function library for Python. It provides C compatible data types, and allows callingfunctions in DLLs or shared libraries. It can be used to wrap these libraries in pure Python.” —— 引⾃ Python 3.5 chm ⽂档。其⼤意就是——ctypes 是⼀个为 Python 准备的外部函数库。它提供兼容C的数据类型,并允许调⽤DLL或共享库中的函数。通过它,可以使⽤纯粹的 Python 包装这些函数库(这样你就可以直接 import xxx 来使⽤这些函数库了)。具体实例可以参考:lib⽬录python时如何通过ctype调⽤c的接⼝:⾸先需要加载由c代码编译⽣成的动态库,得到代表动态库的对象,然后通过该对象调⽤库中的接⼝,具体代码:
通过上述代码可以看到具体ctype的⽤法,python中定义的plus接⼝就是通过调⽤c语⾔实现的plus接⼝实现的。c类型与Python类型:参数类型、返回类型:C语⾔的类型与python的数据类型时不⼀样的,但是ctypes可以实现C语⾔类型与python类型的透明转换。在上述实例中其实有⼀个取巧的地⽅:就是利⽤了python默认函数的参数类型和返回类型都是int型,⽽C语⾔中plus接⼝的参数和返回值类型也都是int型,这样就不⽤显⽰的告诉python这个lib库中的函数的参数和返回值类型,如果C语⾔中plus的参数和返回值类型时float类型,这时候就需要显⽰的指定,通过函数的两个属性restype和argtypes赋值了:es = (c_float, c_float) # plus 有两个形参,都是 float 类型e = c_float # plus 返回值的类型是 flaot然后再按之前的⽅式调⽤: .(1,2)
这⾥还有⼀个特殊情况,就是返回值或者参数时结构体的情况,在python中是没有结构体的概念的,但是为了能在python中表⽰⼀个结构体,我们可以在python中定义⼀个类,⽤来表⽰C语⾔中的结构体类型:
该图中展⽰的时C语⾔中对StructTest结构体的定义:
该图中展⽰的是在python中如何表⽰StructTest结构体,两个要点: 1.类必须继承⾃ure 2.描述结构体成员时需要在类中顶⼀个⼀个_fields_的属性,并赋值给表⽰成员的⼀个列表。这样就可以正常使⽤StructTest结构体了:
指针类型:主要有三个与指针相关的ctypes函数:
pointer 和 POINTER 的区别是,pointer 返回⼀个实例,POINTER 返回⼀个类型具体的使⽤可以参考setinfo接⼝。Swig:Swig是另外⼀种把c/c+代码家⼝给python或其他语⾔调⽤的⼯具,SWIG本质上是个代码⽣成器,为C/C++程序⽣成到其他语⾔的包装代码(wrapper code),这些包装代码⾥会利⽤各语⾔提供的C API,将C/C++程序中的内容暴露给相应语⾔。为了⽣成这些包装代码,SWIG需要⼀个接⼝描述⽂件,描述将什么样的接⼝暴露给其他语⾔。SWIG的 接⼝描述⽂件可以包含以下内容:1)ANSI C函数原型声明2)ANSI C变量声明 3) SWIG指⽰器(directive)相关内容。SWIG可以直接接受”.h”头⽂件做为接⼝描述⽂件。在有了接⼝描述⽂件后,就可以利⽤swig命令⽣ 成包装代码了,然后将包装代码编译链接成可被其他语⾔调⽤的库。SWIG包含以下⼏部分内容:1.⼀个代码⽣成器(swig):代码⽣成器根据接⼝说明⽂件,⽣成相应的包装代码。2.⼀个库:SWIG将常⽤的内容放到SWIG库⾥了,⽐如对数组、指针的⽀持,字符串⽀持,STL⽀持等。可以在接⼝⽂件中直接引⽤库⾥的内容,⼤⼤⽅便接⼝⽂件的编写。具体实例可以参考:swig⽬录 swig通过解析C头⽂件并⾃动创建扩展代码来操作,要使⽤swig⾸先需要⼀个c有⽂件,有了头⽂件下⼀步就是编写⼀个swig的接⼝⽂件,按照约定,这些⽂件以“*.i”作为后缀⼀旦写好了接⼝⽂件,就可以在命令⾏中调⽤swig了:通过上述三条命令会在当前⽬录下⽣成⼀个so⽂件,该⽂件可以被python直接引⽤,就可以直接使⽤⾥⾯的接⼝了。对⽐:ctypes不需要程序员熟悉C/C++语⾔,不需要安装⼀个C/C++的编译器,它通过操作系统的接⼝直接操作C/C++代码。⽽且ctypes是标准库的⼀部分,只要安装了Python就可以直接使⽤。这⼏个原因使得它深受Python程序员的喜爱;⽽它的劣势就是对c++⽀持不好。使⽤SWIG,通过编写⼀个接⼝⽂件,使⽤类似于C/C++语法——声明函数、类型的信息,然后使⽤特殊的⼯具为C/C++的代码⽣成Python的接⼝代码。这些接⼝代码能够在Python与C/C++之间的数据结构转换。最终编译这些接⼝代码,成为Python的⼆进制模块。SWIG的接⼝⽂件与C/C++的头⽂件⾮常相似。SWIG能够为多种脚本语⾔⽣成转换代码。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1688931928a184881.html
评论列表(0条)