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

 更新时间:2019年01月29日 11:51:42   作者:JimmyU1  
今天小编就为大家分享一篇关于使用Python向C语言的链接库传递数组、结构体、指针类型的数据,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

使用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))

4.写在最后

以上就是我们今天踩过的坑,其实发现网上对于ctypes的相关文章不是很多,因此想写出来跟大家分享一下,希望大家少踩坑,快速的完成任务,远离加班,周末愉快!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Python利用卡方Chi特征检验实现提取关键文本特征

    Python利用卡方Chi特征检验实现提取关键文本特征

    卡方检验最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否。本文将利用卡方Chi特征检验实现提取关键文本特征功能,感兴趣的可以了解一下
    2022-12-12
  • 解决Django的request.POST获取不到内容的问题

    解决Django的request.POST获取不到内容的问题

    今天小编就为大家分享一篇解决Django的request.POST获取不到内容的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python+Pygame实现怀旧游戏飞机大战

    Python+Pygame实现怀旧游戏飞机大战

    第一次见到飞机大战是在小学五年级下半学期的时候,这个游戏中可以说包含了几乎所有我目前可接触到的pygame知识。本文就来利用Pygame实现飞机大战游戏,需要的可以参考一下
    2022-11-11
  • Python 中如何将十六进制转换为 Base64

    Python 中如何将十六进制转换为 Base64

    本篇文章将介绍在 Python 中将 hex 转换为 base64 的方法,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Python爬虫403错误的终极解决方案

    Python爬虫403错误的终极解决方案

    爬虫在爬取数据时,常常会遇到"HTTP Error 403: Forbidden"的提示,其实它只是一个HTTP状态码,表示你在请求一个资源文件但是nginx不允许你查看,下面这篇文章主要给大家介绍了关于Python爬虫403错误的终极解决方案,需要的朋友可以参考下
    2023-05-05
  • Python自动化办公之生成PDF报告详解

    Python自动化办公之生成PDF报告详解

    因为工作需要经常需要生成很多的PDF报告给客户查看产品效果以及过程的讲解,每次都需要按照一定的格式的编写文档并生成PDF报告,这样重复性的工作实在太累。本文就来用Python实现自动生成PDF报告吧
    2023-03-03
  • pandas删除行删除列增加行增加列的实现

    pandas删除行删除列增加行增加列的实现

    这篇文章主要介绍了pandas删除行删除列增加行增加列的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Django 权限认证(根据不同的用户,设置不同的显示和访问权限)

    Django 权限认证(根据不同的用户,设置不同的显示和访问权限)

    这篇文章主要介绍了Django 权限认证(根据不同的用户,设置不同的显示和访问权限),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python第三方库的几种安装方式(小结)

    Python第三方库的几种安装方式(小结)

    这篇文章主要介绍了Python第三方库的几种安装方式(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • VSCode安装Django插件后实现html语法提示的方法步骤

    VSCode安装Django插件后实现html语法提示的方法步骤

    Vscode是微软推出的一款优秀的ide开发工具,界面简洁美观、默认支持中文,拥有丰富的插件,支持Windows,OS X和Linux,下面这篇文章主要给大家介绍了关于VSCode安装Django插件后实现html语法提示的方法步骤,需要的朋友可以参考下
    2022-08-08

最新评论