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获取远程文件大小的函数代码分享
May 13 Python
用python代码做configure文件
Jul 20 Python
Python基于有道实现英汉字典功能
Jul 25 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
利用ctypes提高Python的执行速度
Sep 09 Python
Python3调用微信企业号API发送文本消息代码示例
Nov 10 Python
Python Paramiko模块的使用实际案例
Feb 01 Python
Django rest framework实现分页的示例
May 24 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 Python
pygame实现俄罗斯方块游戏(基础篇3)
Oct 29 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 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
详解PHP显示MySQL数据的三种方法
2008/06/05 PHP
php 什么是PEAR?(第三篇)
2009/03/19 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
thinkPHP5框架自定义验证器实现方法分析
2018/06/11 PHP
javascript中的有名函数和无名函数
2007/10/17 Javascript
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
2013/08/29 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
2016/01/20 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
2017/05/05 Javascript
详解A标签中href=""的几种用法
2017/08/20 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
定制FileField中的上传文件名称实例
2017/08/23 Python
Python反射用法实例简析
2017/12/22 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
Python3 log10()函数简单用法
2019/02/19 Python
python变量的存储原理详解
2019/07/10 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
python实现井字棋小游戏
2020/03/04 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
python定义具名元组实例操作
2021/02/28 Python
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
小学清明节活动方案
2014/03/08 职场文书
实现中国梦思想汇报2014
2014/09/13 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers