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

 更新时间:2019年06月19日 09:52:53   作者:bluedream  
这篇文章主要介绍了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函数调用中,问题应当出在参数上,回传的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-接口开发入门解析

    这篇文章主要介绍了Python-接口开发入门解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • pytorch中[..., 0]的用法说明

    pytorch中[..., 0]的用法说明

    这篇文章主要介绍了pytorch中[..., 0]的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python编写Windows Service服务程序

    Python编写Windows Service服务程序

    这篇文章主要为大家详细介绍了Python编写Windows Service服务程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Python中sub()的用法说明

    Python中sub()的用法说明

    这篇文章主要介绍了Python中sub()的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Python爬虫与反爬虫大战

    Python爬虫与反爬虫大战

    这篇文章主要介绍了Python爬虫与反爬虫的相关资料,文中讲解非常细致,帮助大家更好的理解Python爬虫与反爬虫的关系,感兴趣的朋友可以了解下
    2020-07-07
  • 发布你的Python模块详解

    发布你的Python模块详解

    这篇文章主要介绍了发布你的Python模块详解的相关资料,需要的朋友可以参考下
    2016-09-09
  • Tensorflow深度学习使用CNN分类英文文本

    Tensorflow深度学习使用CNN分类英文文本

    这篇文章主要为大家介绍了Tensorflow深度学习CNN实现英文文本分类示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • Python文本统计功能之西游记用字统计操作示例

    Python文本统计功能之西游记用字统计操作示例

    这篇文章主要介绍了Python文本统计功能之西游记用字统计操作,结合实例形式分析了Python文本读取、遍历、统计等相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • Python配置pip国内镜像源的实现

    Python配置pip国内镜像源的实现

    这篇文章主要介绍了Python配置pip国内镜像源的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Python遗传算法Geatpy工具箱使用介绍

    Python遗传算法Geatpy工具箱使用介绍

    这篇文章主要为大家介绍了Python遗传算法Geatpy工具箱使用介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论