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


Posted in Python onJanuary 29, 2019

使用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 相关文章推荐
python正则表达式re模块详解
Jun 25 Python
Linux环境下MySQL-python安装过程分享
Feb 02 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 Python
用Python编写生成树状结构的文件目录的脚本的教程
May 04 Python
python引入导入自定义模块和外部文件的实例
Jul 24 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
Feb 20 Python
树莓派实现移动拍照
Jun 22 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
python已协程方式处理任务实现过程
Dec 27 Python
TensorFlow设置日志级别的几种方式小结
Feb 04 Python
Python Websocket服务端通信的使用示例
Feb 25 Python
pandas去重复行并分类汇总的实现方法
Jan 29 #Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 #Python
Python使用ctypes调用C/C++的方法
Jan 29 #Python
dataframe 按条件替换某一列中的值方法
Jan 29 #Python
Numpy之random函数使用学习
Jan 29 #Python
pandas DataFrame 删除重复的行的实现方法
Jan 29 #Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 #Python
You might like
php使用GD实现颜色渐变实例
2015/06/02 PHP
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
JavaScript实现MIPS乘法模拟的方法
2015/04/17 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
说说如何使用Vuex进行状态管理(小结)
2019/04/14 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
python中list常用操作实例详解
2015/06/03 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
CSS3实现背景透明文字不透明的示例代码
2018/06/25 HTML / CSS
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
小学生读书感言
2014/02/12 职场文书
啤酒节策划方案
2014/05/28 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书