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 相关文章推荐
web.py获取上传文件名的正确方法
Aug 26 Python
Python环境变量设置方法
Aug 28 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
Python实现的圆形绘制(画圆)示例
Jan 31 Python
Python简单实现查找一个字符串中最长不重复子串的方法
Mar 26 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
python如何实现视频转代码视频
Jun 17 Python
pyqt5 QProgressBar清空进度条的实例
Jun 21 Python
python日期相关操作实例小结
Jun 24 Python
浅谈图像处理中掩膜(mask)的意义
Feb 19 Python
Python用dilb提取照片上人脸的示例
Oct 26 Python
python区块链持久化和命令行接口实现简版
May 25 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
星际实力自我测试
2020/03/04 星际争霸
微信自定义菜单的处理开发示例
2015/04/16 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
Jquery post传递数组方法实现思路及代码
2013/04/28 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
一个简单不报错的summernote 图片上传案例
2016/07/11 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
jQuery列表检索功能实现代码
2017/07/17 jQuery
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
pyqt4教程之实现半透明的天气预报界面示例
2014/03/02 Python
跟老齐学Python之网站的结构
2014/10/24 Python
python集合用法实例分析
2015/05/30 Python
关于Django外键赋值问题详解
2017/08/13 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
通用C#笔试题附答案
2016/11/26 面试题
大学生简历中个人的自我评价
2013/10/06 职场文书
机械专业毕业生推荐信范文
2013/11/25 职场文书
教师旷工检讨书
2014/01/18 职场文书
土木工程专业推荐信
2014/02/19 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
教师四风问题整改措施
2014/09/25 职场文书
初中作文评语集锦
2014/12/25 职场文书
优秀团队申报材料
2014/12/26 职场文书
个人党性锻炼总结
2015/03/05 职场文书