当前位置: 首页 > 编程笔记 >

python中使用ctypes调用so传参设置遇到的问题及解决方法

齐起运
2023-03-14
本文向大家介绍python中使用ctypes调用so传参设置遇到的问题及解决方法,包括了python中使用ctypes调用so传参设置遇到的问题及解决方法的使用技巧和注意事项,需要的朋友参考一下

问题

近日在做一组声纹聚类时,使用了另一团队同学开发的声纹距离算法。该算法对外提供的是一组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.