使用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结构体数组传出接收c动态库_使用Python向C语言的链接库传递数组、结构体、指针类型的数据...相关推荐

  1. python中的记录指针_使用Python向C语言的链接库传递数组、结构体、指针类型的数据...

    使用python向C语言的链接库传递数组.结构体.指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来 ...

  2. python中max()、min()获得最大值与最小值_(Python基础教程之十)Python max()和min()–在列表或数组中查找最大值和最小值...

    使用**max()和min()**方法在可比较元素的集合(例如列表,集合或数组)中查找最大(或最小)项的Python示例. 1. Python max() function max() 该功能用于– ...

  3. python变量类型是动态的_【Python】python动态类型

    在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢? 动态类型 python使用 ...

  4. python matpoltlib绘制动态图_使用Python、Geopandas和Matplotlib制作gif动态

    原标题:使用Python.Geopandas和Matplotlib制作gif动态 不需要Photoshop:仅使用Python和命令行制作动画图表. 作为一种编程语言,Python非常灵活.这使得有时 ...

  5. python动态图形_用python生成地球运动的动态模拟动态图

    python作为一门简单易学且应用范围极广的语言有着其他语言无法比拟的优势,通过python可以实现各种各样的功能,例如我们可以利用python matplotlib的绘图库实现各种动态模拟仿真,在科 ...

  6. python request库_【Python爬虫】Request库入门

    什么是爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引. ...

  7. python判断题题库_《Python程序设计》判断题1-240题

    1.Python是一种跨平台.开源.免费的高级动态编程语言.(对) 2.Python 3.x完全兼容Python 2.x.(错) 3.Python 3.x和Python 2.x唯一的区别就是:prin ...

  8. python需要安装的库_使用python学习【机器学习】需要安装的库~

    ---------------------------------------------------------------------------------------------------- ...

  9. python能以文本和二进制方式处理文件_使用Python进行二进制文件读写的简单方法(推荐)...

    总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块. python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据 ...

最新文章

  1. UA PHYS515A 电磁理论III 静磁学问题1 Maxwell方程与静磁学问题
  2. 数据结构实验之栈与队列八:栈的基本操作
  3. vue pc端 商品轮播图_轮播图高点击商品图
  4. ROC和AUC介绍以及如何计算AUC(转载+自己重新排版整理)
  5. 数据结构之深度优先搜索(用栈实现)问题
  6. 【渝粤教育】电大中专学前儿童科学教育1作业 题库
  7. MOVSX和MOVZX
  8. sql server实例内存使用统计
  9. 力扣 删除链表的倒数第N个节点
  10. libvpx enabled but no supported decoders found
  11. Centos7.5软硬件、IP地址及主机名称配置详细教程
  12. Ubuntu 搜狗输入法 关闭简繁切换快捷键
  13. html中绝对定位的父级,【CSS学习笔记】绝对定位的父类参照物的确定
  14. 项目管理知识体系指南(五)项目时间管理
  15. 当更高性能来到平板 — ThinkPad X1 Tablet Evo 长测
  16. Ludwig Otto Hölder
  17. markdownpad2 行内公式
  18. 合泰HT32F52352 USART串口与电脑通信控制LED
  19. 搭建自己的简易服务器(公网)
  20. SpringBoot中业务层标准开发和快速开发(大全)

热门文章

  1. 20145305《JAVA程序设计》实验二
  2. 【转】 如何利用C#代码来进行操作AD
  3. 计算机图形学跳一跳_微信小游戏“跳一跳”对内部审计师的启示
  4. python post请求实例_Python3模拟curl发送post请求操作示例
  5. Android Button常用属性
  6. 计算机中函数counta是什么意思,excel中counta函数和count函数的区别是什么?
  7. python 程序块 挂掉的服务_写一个python的服务监控程序
  8. mac 看端口占用并杀死进程
  9. nginx清缓存,网站刷新不过来时用
  10. 用Python显示灰度图像的灰度直方图