问题
近日在做一组声纹聚类时,使用了另一团队同学开发的声纹距离算法。该算法对外提供的是一组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函数调用中,问题应当出在html" target="_blank">参数上,回传的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传参设置遇到的问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
本文向大家介绍ubuntu14.04 使用中遇到的问题及解决方法集锦,包括了ubuntu14.04 使用中遇到的问题及解决方法集锦的使用技巧和注意事项,需要的朋友参考一下 这是第二次安装使用ubuntu了,虽然上一次因为不习惯和不会使用一两天就放弃了,这次坚持的时间稍微长一点,目前ubuntu的基本使用也熟悉了.但是由于ubuntu上的应用太少,常用软件,比如QQ,Photoshop,旺旺等软件无
本文向大家介绍Python中的Socket 与 ScoketServer 通信及遇到问题解决方法,包括了Python中的Socket 与 ScoketServer 通信及遇到问题解决方法的使用技巧和注意事项,需要的朋友参考一下 Socket有一个缓冲区,缓冲区是一个流,先进先出,发送和取出的可自定义大小的,如果取出的数据未取完缓冲区,则可能存在数据怠慢。其中【recv(1024)】表示从缓冲区里取
本文向大家介绍解决vue中使用less/sass及使用中遇到无效的问题,包括了解决vue中使用less/sass及使用中遇到无效的问题的使用技巧和注意事项,需要的朋友参考一下 一:使用方法 在vue官方脚手架中,即vue-lci搭建的项目中,可以轻易的使用less/sass。 先使用npm下载依赖,命令行为'npm install less less-loader –save',再在webpack
本文向大家介绍Mac下使用charles遇到的问题以及解决办法,包括了Mac下使用charles遇到的问题以及解决办法的使用技巧和注意事项,需要的朋友参考一下 最近使用上了Charles,因为之前一直使用Fidder,所以还是碰到了一些问题,这里记录一下。 如何安装破解版 打开charles后,发现访问但是抓不到包 抓取HTTPS的接口,看response是乱码 一、如何安装破解版 正版有30天试
本文向大家介绍Swift 3中使用FMDB遇到的问题与解决方法,包括了Swift 3中使用FMDB遇到的问题与解决方法的使用技巧和注意事项,需要的朋友参考一下 本文主要给大家介绍了关于在Swift 3中使用FMDB遇到的问题与解决方法,分享出来供大家参考学习,下面来一起看看详细的介绍: 状况 OC项目转Swift,打算继续使用FMDB。Cocoapods进来后,在桥接文件 "XXX-Bridgin
本文向大家介绍eclipse+jdk安装以及会遇到的问题及解决方法,包括了eclipse+jdk安装以及会遇到的问题及解决方法的使用技巧和注意事项,需要的朋友参考一下 今天电脑系统崩了,重做了系统,对于我这个非计算机专业的来说,记录一下问win10系统安装eclipse软件和JDK以及配置环境变量时遇到的问题也是好的,希望也可以帮助到刚入行的你。 jdk下载地址: 链接: https://pan.