新西兰服务器

怎么使用Python向C语言的链接库传递数组、结构体、指针类型的数据


怎么使用Python向C语言的链接库传递数组、结构体、指针类型的数据

发布时间:2021-04-25 14:04:36 来源:高防服务器网 阅读:208 作者:小新 栏目:开发技术

这篇文章将为大家详细讲解有关怎么使用Python向C语言的链接库传递数组、结构体、指针类型的数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

python是什么意思

Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写自动化脚本,随着版本的不断更新和新功能的添加,常用于用于开发独立的项目和大型项目。

使用python向C语言的链接库传递数组、结构体、指针类型的数据

由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来调用C语言的代码库。

至于如何调用基础数据类型的数据,请大家参考我的另外一篇文章:Python使用ctypes调用C/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 = dll.test  # 传递参数  test(byref(python_structure))

关于“怎么使用Python向C语言的链接库传递数组、结构体、指针类型的数据”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

[微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

[图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
[