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局域网ip扫描示例分享
Apr 03 Python
Python开发WebService系列教程之REST,web.py,eurasia,Django
Jun 30 Python
Python实现统计英文单词个数及字符串分割代码
May 28 Python
Python实现屏幕截图的代码及函数详解
Oct 01 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
Sep 07 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 Python
python requests模块的使用示例
Apr 07 Python
Python打包为exe详细教程
May 18 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
ajax 文件上传应用简单实现
2009/03/03 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
jquery等宽输出文字插件使用介绍
2013/09/18 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
小学教师学期末自我评价
2013/09/25 职场文书
电子商务专业学生的学习自我评价
2013/10/27 职场文书
数据员岗位职责
2013/11/19 职场文书
银行实习生的自我评价
2013/12/09 职场文书
打架检讨书400字
2014/01/17 职场文书
岗位职责风险防控
2014/02/18 职场文书
综治宣传月活动总结
2014/04/28 职场文书
制冷与空调专业毕业生推荐信
2014/07/07 职场文书
党员检讨书范文
2014/12/27 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
未婚证明格式
2015/06/15 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle