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代码的打包与发布详解
Jul 30 Python
介绍Python中几个常用的类方法
Apr 08 Python
详解python进行mp3格式判断
Dec 23 Python
200行自定义python异步非阻塞Web框架
Mar 15 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
python实现换位加密算法的示例
Oct 14 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
Mar 23 Python
关于pytorch中全连接神经网络搭建两种模式详解
Jan 14 Python
Python : turtle色彩控制实例详解
Jan 19 Python
Python matplotlib实时画图案例
Apr 23 Python
Python学习之异常中的finally使用详解
Mar 16 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
我的论坛源代码(七)
2006/10/09 PHP
实用函数2
2007/11/08 PHP
php实现的短网址算法分享
2014/06/20 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
js类式继承的具体实现方法
2013/12/31 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
2014/01/02 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
Python reduce()函数的用法小结
2017/11/15 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
Pycharm修改python路径过程图解
2020/05/22 Python
python MD5加密的示例
2020/10/19 Python
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
英国泽西岛植物:Jersey Plants Direct
2019/08/07 全球购物
科颜氏法国官网:Kiehl’s法国
2019/08/20 全球购物
xml有哪些解析技术?区别是什么
2016/04/26 面试题
经济管理毕业生求职信
2014/03/15 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
培训计划通知
2015/07/15 职场文书
如何做好员工培训计划?
2019/07/09 职场文书
浅析Django接口版本控制
2021/06/26 Python
Java实现聊天机器人完善版
2021/07/04 Java/Android