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使用装饰器和线程限制函数执行时间的方法
Apr 18 Python
利用Python的装饰器解决Bottle框架中用户验证问题
Apr 24 Python
Python中使用Beautiful Soup库的超详细教程
Apr 30 Python
Python sys.argv用法实例
May 28 Python
在Python的while循环中使用else以及循环嵌套的用法
Oct 14 Python
Python中pygame安装方法图文详解
Nov 11 Python
python学习入门细节知识点
Mar 29 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 Python
浅析Python 中几种字符串格式化方法及其比较
Jul 02 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
pandas中ix的使用详细讲解
Mar 09 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 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实现正则匹配所有括号中的内容
2018/06/22 PHP
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
jquery中toggle函数交替使用问题
2015/06/22 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
Vue实现Layui的集成方法步骤
2020/04/10 Javascript
js事件机制----捕获与冒泡机制实例分析
2020/05/22 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
Python程序设计入门(1)基本语法简介
2014/06/13 Python
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
对Python中class和instance以及self的用法详解
2019/06/26 Python
kali中python版本的切换方法
2019/07/11 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
展会邀请函范文
2014/01/26 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
幼儿园小班家长寄语
2014/04/02 职场文书
环保志愿者活动总结
2014/06/27 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
企业团队精神心得体会
2016/01/19 职场文书
在python中实现导入一个需要传参的模块
2021/05/12 Python