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 相关文章推荐
下载给定网页上图片的方法
Feb 18 Python
python中os操作文件及文件路径实例汇总
Jan 15 Python
python处理csv数据的方法
Mar 11 Python
python字典操作实例详解
Nov 16 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
Python爬虫框架Scrapy实例代码
Mar 04 Python
TensorFlow变量管理详解
Mar 10 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
Python使用OpenPyXL处理Excel表格
Jul 02 Python
Python 如何反方向迭代一个序列
Jul 28 Python
Django启动时找不到mysqlclient问题解决方案
Nov 11 Python
Python获取字典中某个key的value
Apr 13 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 minixml详解
2008/07/19 PHP
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
学习jQuey中的return false
2015/12/18 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
js时间控件只显示年月
2017/01/08 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
python 遍历字符串(含汉字)实例详解
2017/04/04 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
python矩阵的转置和逆转实例
2018/12/12 Python
Python中的元组介绍
2019/01/28 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
Python中无限循环需要什么条件
2020/05/27 Python
Python 实现进度条的六种方式
2021/01/06 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
办公室前台岗位职责
2014/01/04 职场文书
安全在我心中演讲稿
2014/09/01 职场文书
一般党员对照检查材料
2014/09/24 职场文书
2014年预备党员群众路线教育实践活动对照检查材料思想汇报
2014/10/02 职场文书
军人离婚协议书样本
2014/10/21 职场文书
千手观音观后感
2015/06/03 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
《烈火英雄》观后感:致敬和平时代的英雄
2019/11/11 职场文书
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers