这篇文章将为大家详细讲解有关怎么使用Python向C语言的链接库传递数组,结构体,指针类型的数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
Python是什么意思
Python是一种跨平台的,具有解释性,编译性,互动性和面向对象的脚本语言,其最初的设计是用于编写自动化脚本,随着版本的不断更新和新功能的添加,常用于用于开发独立的项目和大型项目。
<强>使用Python向C语言的链接库传递数组,结构体,指针类型的数据强>
由于最近的项目频繁使用Python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来调用C语言的代码库。
至于如何调用基础数据类型的数据,请大家参考我的另外一篇文章:Python使用ctypes调用C/c++的方法
<强> 1。使用python给C语言函数传递数组类型的参数强>
想必很多时候,C语言会使用数组作为参数,在之前我们使用过ctypes的一些数据类型作为C语言参数类型,包括字节,短,int,双之类的,但是在使用数组类型的时候,我们也是有着类似的做法、下面我们看实例:
<强> 1.1 C语言的代码块强>
一个简单的数组输入,以及一个简单将数组作为参数的函数
int 输入[2],=,[0,1] void printIntArray (int[],输入){ 的才能(int 小姐:=,0;,小姐:& lt,, 2,,小姐:+ +){ ,,,印刷(输入[我]); ,,} }
<>强python 1.2代码块强>
下面我们将演示如何调用上面的代码
得到ctypes import * #,假设上面的代码被编译成了一个XXXXlib.so的文件 时间=dll CDLL (& # 39; XXXXlib.so& # 39;) #,声明一个数组类型 时间=INPUT c_int * 2 #,实例化一个长度为2的整型数组 时间=input 输入() #,为数组赋值(输入这个数组是不支持迭代的) 输入[0],=,1 输入[1],=,2 #,引用C语言的函数 print_int_array =dll.printIntArray #,调用C语言的函数 print_int_array(输入)
<强> 1.3小结强>
使用数组的方法基本就是这样的,声明什么类型的数组只需要根据之前python官方文档里ctypes使用说明对照着声明数组就可以了。
<强> 2。使用python给C语言函数传递结构体类型的参数强>
当然,为了满足一些个性化的需求和为了使程序更容易让人理解,更多的时候开发人员也会使用结构体类型的变量为函数赋值。现在我们使用ctypes来实例化一个C语言的结构体,请看实例:
由于第一部分我们已经介绍了如何简单的调用C语言的函数,我们下面只写结构体相关的python代码
得到ctypes import * #,声明一个类,继承自ctypes.Structure class PythonStructure(结构): _fields_才能:[(& # 39;param1 # 39;, c_int), (& # 39; param2& # 39;,, c_int), (& # 39; param3& # 39;,, c_int *, 2)) #,实例化变量 时间=python_structure PythonStructure () #,赋值 python_structure.param1 =1 时间=python_structure.param2 3 时间=PARAM c_int * 2 时间=param3 参数() param3 [0],=3 param3 [1],=4 python_structure.param3 =, param3
从代码中我们可以看的到,我们声明了一个类,使其继承自ctypes.Structure,然后在类的内部声明了变量,领域这样一个变量域,里面用元组存贮这结构体的每个结构体内部变量的变量名和数据类型。
然后在实际的使用过程中,首先要实例化一个PythonStructure类型的变量,然后为其各个内部变量赋值。
<强> 3。使用python给C语言函数传递指针类型的参数强>
指针作为C语言相比于其他原因最大的优势,在C语言程序中会大量的使用指针,因此将指针类型的数据作为参数传递其实是十分的普遍的,下面我们直接上实例:
<强> 3.1 C语言函数声明强>
void 测试(pystruct * ps)
假设这里的pystruct与我们在第二部分声明的结构体相对应(我这渣渣C语言功底实在是怕写出什么错误的代码误导大家)
<强> python 3.2代码强>
使用指针类型的数据只需要在调用<代码> btref()> 代码就可以了
得到ctypes import * #,声明一个类,继承自ctypes.Structure class PythonStructure(结构): _fields_才能:[(& # 39;param1 # 39;, c_int), (& # 39; param2& # 39;,, c_int), (& # 39; param3& # 39;,, c_int *, 2)) #,实例化变量 时间=python_structure PythonStructure () #,赋值 python_structure.param1 =1 时间=python_structure.param2 3 时间=PARAM c_int * 2 时间=param3 参数() param3 [0],=3 param3 [1],=4 python_structure.param3 =param3 #,开始调用 时间=dll CDLL (& # 39; XXXXlib.so& # 39;) test =dll.test #,传递参数 之前测试时(byref (python_structure)怎么使用Python向C语言的链接库传递数组,结构体,指针类型的数据