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计算程序开始到程序结束的运行时间和程序运行的CPU时间
Nov 28 Python
python调用短信猫控件实现发短信功能实例
Jul 04 Python
Python设计模式之中介模式简单示例
Jan 09 Python
python+opencv+caffe+摄像头做目标检测的实例代码
Aug 03 Python
Python写一个基于MD5的文件监听程序
Mar 11 Python
PyQt 图解Qt Designer工具的使用方法
Aug 06 Python
wxPython实现带颜色的进度条
Nov 19 Python
keras中的backend.clip用法
May 22 Python
python 实现两个npy档案合并
Jul 01 Python
django跳转页面传参的实现
Sep 17 Python
Python通过队列来实现进程间通信的示例
Oct 14 Python
使用Pytorch搭建模型的步骤
Nov 16 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下将图片以二进制存入mysql数据库中并显示的实现代码
2010/05/27 PHP
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
dropdownlist之间的互相联动实现(显示与隐藏)
2009/11/24 Javascript
JavaScript 空位补零实现代码
2010/02/26 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
Active控件问题小结(附解决办法)
2016/06/09 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
Python程序设计入门(5)类的使用简介
2014/06/16 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
关于多元线性回归分析——Python&SPSS
2020/02/24 Python
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
Laravel中Kafka的使用详解
2021/03/24 PHP
机电一体化求职信
2014/03/10 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
优秀护士事迹材料
2014/12/25 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书