使⽤Python向C语⾔的链接库传递数组、结构体、指针类
型的数据
使⽤python向C语⾔的链接库传递数组、结构体、指针类型的数据
由于最近的项⽬频繁使⽤python调⽤同事的C语⾔代码,在调⽤过程中踩了很多坑,⼀点⼀点写出来供⼤家参考,我们仍然是使⽤ctypes来调⽤C语⾔的代码库。
⾄于如何调⽤基础数据类型的数据,请⼤家参考我的另外⼀篇⽂章:
1. 使⽤python给C语⾔函数传递数组类型的参数
想必很多时候,C语⾔会使⽤数组作为参数,在之前我们使⽤过ctypes的⼀些数据类型作为C语⾔参数类型,包括byte、short、int、double之类的,但是在使⽤数组类型的时候,我们也是有着类似的做法,下⾯我们看实例:
1.1 C语⾔的代码块
⼀个简单的数组输⼊,以及⼀个简单将数组作为参数的函数
int input[2] = [0, 1]
void printIntArray(int[] input){
for(int i = 0; i < 2; i ++){
print(input[i]);
}
}
1.2 python代码块
下⾯我们将演⽰如何调⽤上⾯的代码
from ctypes import *
# 假设上⾯的代码被编译成了⼀个XXXXlib.so的⽂件
dll = CDLL('XXXXlib.so')
# 声明⼀个数组类型
INPUT = c_int * 2
# 实例化⼀个长度为2的整型数组
input = INPUT()
# 为数组赋值(input这个数组是不⽀持迭代的)
input[0] = 1
input[1] = 2
# 引⽤C语⾔的函数
print_int_array = dll.printIntArray
# 调⽤C语⾔的函数
print_int_array(input)
1.3 ⼩结
使⽤数组的⽅法基本就是这样的,声明什么类型的数组只需要根据之前python官⽅⽂档⾥ctypes使⽤说明对照着声明数组就可以了。
2. 使⽤python给C语⾔函数传递结构体类型的参数
当然,为了满⾜⼀些个性化的需求和为了使程序更容易让⼈理解,更多的时候开发⼈员也会使⽤结构体类型的变量为函数赋值。现在我们使⽤ctypes来实例化⼀个C语⾔的结构体,请看实例:
由于第⼀部分我们已经介绍了如何简单的调⽤C语⾔的函数,我们下⾯只写结构体相关的python代码
from ctypes import *
# 声明⼀个类,继承⾃ctypes.Structure
class PythonStructure(Structure):
_fields_:[('param1',c_int),('param2', c_int),('param3', c_int * 2)]
# 实例化变量
python_structure = PythonStructure()
# 赋值
python_structure.param1 = 1
python_structure.param2 = 3
PARAM = c_int * 2
param3 = PARAM()
param3[0] = 3
param3[1] = 4
python_structure.param3 = param3
从代码中我们可以看到,我们声明了⼀个class,使其继承⾃ctypes.Structure,然后在类的内部声明了变量,fields这样⼀个变量域,⾥⾯⽤元组存贮这结构体的每个结构体内部变量的变量名和数据类型。
然后在实际的使⽤过程中,⾸先要实例化⼀个PythonStructure类型的变量,然后为其各个内部变量赋值。
3. 使⽤python给C语⾔函数传递指针类型的参数
指针作为C语⾔相⽐于其他原因最⼤的优势,在C语⾔程序中会⼤量的使⽤指针,因此将指针类型的数据作为参数传递其实是⼗分的普遍的,下⾯我们直接上实例:
3.1 C语⾔函数声明
void test(pystruct *ps)
假设这⾥的pystruct与我们在第⼆部分声明的结构体相对应(我这渣渣C语⾔功底实在是怕写出什么错误的代码误导⼤家)
3.2 python代码
使⽤指针类型的数据只需要在调⽤btref()就可以了
from ctypes import *
# 声明⼀个类,继承⾃ctypes.Structure
class PythonStructure(Structure):
_fields_:[('param1',c_int),('param2', c_int),('param3', c_int * 2)]
# 实例化变量
python_structure = PythonStructure()
# 赋值
python_structure.param1 = 1
python_structure.param2 = 3
PARAM = c_int * 2
param3 = PARAM()
param3[0] = 3
param3[1] = 4
python_structure.param3 = param3
# 开始调⽤
dll = CDLL('XXXXlib.so')
test = st
# 传递参数
test(byref(python_structure))
4.写在最后
以上就是我们今天踩过的坑,其实发现⽹上对于ctypes的相关⽂章不是很多,因此想写出来跟⼤家分享⼀下,希望⼤家少踩坑,快速的完成任务,远离加班,周末愉快!
总结
编程先学c语言还是python
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。如果你想了解更多相关内容请查看下⾯相关链接

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。