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抓取豆瓣图片并自动保存示例学习
Jan 10 Python
python3之微信文章爬虫实例讲解
Jul 12 Python
Python中Scrapy爬虫图片处理详解
Nov 29 Python
Java及python正则表达式详解
Dec 27 Python
python pandas写入excel文件的方法示例
Jun 25 Python
python使用requests.session模拟登录
Aug 09 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
Nov 07 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
Python基于class()实现面向对象原理详解
Mar 26 Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 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 动态随机生成验证码类代码
2010/04/09 PHP
php Smarty初体验二 获取配置信息
2011/08/08 PHP
php explode函数实例代码
2012/02/27 PHP
浅谈php冒泡排序
2014/12/30 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
jquery获得keycode的示例代码
2013/12/30 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
2015/12/29 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
JavaScript动态生成表格的示例
2020/11/02 Javascript
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
Python的词法分析与语法分析
2013/05/18 Python
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
股权转让意向书
2014/04/01 职场文书
中文专业求职信
2014/06/20 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
python四种出行路线规划的实现
2021/06/23 Python
MySQL 十大常用字符串函数详解
2021/06/30 MySQL
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis