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中map和列表推导效率比较实例分析
Jun 17 Python
python 循环遍历字典元素的简单方法
Sep 11 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 Python
快速查询Python文档方法分享
Dec 27 Python
不知道这5种下划线的含义,你就不算真的会Python!
Oct 09 Python
Python Pandas中根据列的值选取多行数据
Jul 08 Python
Python爬虫:将headers请求头字符串转为字典的方法
Aug 21 Python
python 协程中的迭代器,生成器原理及应用实例详解
Oct 28 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
Jan 06 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
Jan 18 Python
基于Python3读写INI配置文件过程解析
Jul 23 Python
python实现经纬度采样的示例代码
Dec 10 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 选项及相关信息函数库
2006/12/04 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
php实现登陆模块功能示例
2016/10/20 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
Prototype使用指南之enumerable.js
2007/01/10 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
JS中Location使用详解
2015/05/12 Javascript
jQuery插件zepto.js简单实现tab切换
2015/06/16 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
如何实现小程序tab栏下划线动画效果
2019/05/18 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
JS document文档的简单操作完整示例
2020/01/13 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
python进程间通信Queue工作过程详解
2019/11/01 Python
Python3 集合set入门基础
2020/02/10 Python
TensorBoard 计算图的查看方式
2020/02/15 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
单身联谊活动方案
2014/01/29 职场文书
机械设计及其自动化求职推荐信
2014/02/17 职场文书
祖国在我心中演讲稿600字
2014/05/04 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
贫困证明怎么写
2015/06/16 职场文书
放假通知怎么写
2015/08/18 职场文书