python中使用ctypes调用so传参设置遇到的问题及解决方法


Posted in Python onJune 19, 2019

问题

近日在做一组声纹聚类时,使用了另一团队同学开发的声纹距离算法。该算法对外提供的是一组so包,需要使用方自己去使用。在python中调用纯so包一般使用ctypes类库,用起来看起来简单但也有不少细节容易犯错。本次使用过程中,就遇到传参的问题。

目标so库中对外export的函数是大致如下的三个函数:

void* create_handler();
  int extract_feature(void* hander);
  bool destroy(void* handler);

这三个函数使用起来倒也简单,顺序使用就可以了。但发现写成如下形式的python代码后,执行会直接segment fault。

import sys
  import ctypes
  so = ctypes.CDLL("./lib/libbase.so")
  p = so.create_handler()
  feature = so.extract_feature(p)
  so.destroy(p)

解决

这段代码中p是int类型,由void*自动转来,在ctyeps中这种转型本身是没问题的。segment fault发生在extract_feature函数调用中,问题应当出在参数上,回传的handler已经不是原来的pointer了,导致访问指针出错。

查阅ctypes的文档后,发现ctypes可以声明so库中函数的参数,返回类型。试了试,显示声明后问题得到了解决,证明我们的猜想是对的,确实指针发生了变化。修改后代码如下:

import sys
  import ctypes
  so = ctypes.CDLL("./lib/libbase.so")
  so.create_handler.restype=ctypes.c_void_p
  so.extract_feature.argtypes=[ctypes.c_void_p]
  so.destroy.argtypes=[ctypes.c_void_p]
  p = so.create_handler()
  feature = so.extract_feature(p)
  so.destroy(p)

结论:

ctypes中传递指针类型参数需要显示声明c函数的参数,返回类型。

总结

以上所述是小编给大家介绍的python中使用ctypes调用so传参设置遇到的问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python中的Matplotlib模块入门教程
Apr 15 Python
解读Django框架中的低层次缓存API
Jul 24 Python
Python数据可视化正态分布简单分析及实现代码
Dec 04 Python
NetworkX之Prim算法(实例讲解)
Dec 22 Python
python实现关键词提取的示例讲解
Apr 28 Python
python中logging模块的一些简单用法的使用
Feb 22 Python
Python进阶之@property动态属性的实现
Apr 01 Python
python 实现按对象传值
Dec 26 Python
django实现模型字段动态choice的操作
Apr 01 Python
Python数据相关系数矩阵和热力图轻松实现教程
Jun 16 Python
基于K.image_data_format() == 'channels_first' 的理解
Jun 29 Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 Python
华为校园招聘上机笔试题 扑克牌大小(python)
Apr 22 #Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 #Python
python操作kafka实践的示例代码
Jun 19 #Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 #Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
Jun 19 #Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 #Python
在Qt中正确的设置窗体的背景图片的几种方法总结
Jun 19 #Python
You might like
PHP中的正则表达式函数介绍
2012/02/27 PHP
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
PHP中常用的输出函数总结
2014/09/22 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
php PDO判断连接是否可用的实现方法
2017/04/03 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
2008/12/29 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
SVG实现时钟效果
2018/07/17 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
go和python调用其它程序并得到程序输出
2014/02/10 Python
python中解析json格式文件的方法示例
2017/05/03 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
如何使用repr调试python程序
2020/02/28 Python
Django视图、传参和forms验证操作
2020/07/15 Python
用python对oracle进行简单性能测试
2020/12/05 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
介绍一下代理模式(Proxy)
2014/10/17 面试题
庆祝教师节活动方案
2014/01/31 职场文书
品牌服务方案
2014/06/03 职场文书
大学学生会辞职信
2015/05/13 职场文书
卡特教练观后感
2015/06/08 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
详解MindSpore自定义模型损失函数
2021/06/30 Python
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis