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根据出生年份简单计算生肖的方法
Mar 27 Python
Python的Django框架中从url中捕捉文本的方法
Jul 20 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
Sep 30 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
Nov 08 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 Python
Django中ORM找出内容不为空的数据实例
May 20 Python
PyQt5实现简单的计算器
May 30 Python
python Tornado框架的使用示例
Oct 19 Python
Django migrate报错的解决方案
May 20 Python
一篇文章带你搞懂Python类的相关知识
May 20 Python
总结python多进程multiprocessing的相关知识
Jun 29 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
一个odbc连mssql分页的类
2006/10/09 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
详解js的六大数据类型
2016/12/27 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
python安装教程
2018/02/28 Python
python3 pygame实现接小球游戏
2019/05/14 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
对Python函数设计规范详解
2019/07/19 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Python Tkinter模块 GUI 可视化实例
2019/11/20 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
基于Tensorflow批量数据的输入实现方式
2020/02/05 Python
浅谈Python里面None True False之间的区别
2020/07/09 Python
Python实现淘宝秒杀功能的示例代码
2021/01/19 Python
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
JSF界面控制层技术
2013/06/17 面试题
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis
基于JavaScript实现省市联动效果
2021/06/22 Javascript