问题

近日在做一组声纹聚类时,使用了另一团队同学开发的声纹距离算法。该算法对外提供的是一组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中使用ctypes调用so传参设置遇到的问题及解决方法

本文地址: http://www.cppcns.com/jiaoben/python/262707.html

python调用so库输出传入指针_python中使用ctypes调用so传参设置遇到的问题及解决方法...相关推荐

  1. python青蛙跳台阶_Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法

    前言 跳台阶.变态跳台阶.矩形覆盖其实都和斐波那契数列是一类问题,文中通过示例代码介绍的非常详细,下面话不多说了,来一起看看详细的介绍吧. 跳台阶 问题描述: 一只青蛙一次可以跳上1级台阶,也可以跳上 ...

  2. python调用ctypes中windll中的方法超时处理_python中使用ctypes调用MinGW生成的动态链接库(dll)...

    关于gcc编译dll的我就不说了,网上举例一大堆,下面以g++为例. 假设有一个test.cpp文件如下: extern "C" { __declspec(dllexport) d ...

  3. python输入什么就输出什么意思_python中的输入与输出是什么?(实例详解)

    对于第一次接触到python这门编程语言的朋友来说,刚刚开始学习python编程的时候对于python中的输入与输出这一方面的了解比较少,在这篇文章之中我们就来了解一下python输入与输出的相关知识 ...

  4. python输入秒数输出分钟小时_Python函数将秒到分钟,小时,天问题,怎么解决

    慕盖茨4494581 为了美化日志输出程序执行的总时间,同时人们能够快速获取所需要的信息,需要把输出的秒数转换成  228 days, 22 hour, 9 min,39.0 sec 这样的格式.因为 ...

  5. python import 找不到指定模块_Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法...

    关于conda安装matplotlib报错 最近在师姐机器上跑实验的时候,想利用matplotlib包来绘制损失曲线图,安装过程中碰到了一些小麻烦,感觉之前好像也碰到过类似的问题,网上一搜什么nump ...

  6. python函数库分类及实例_Python中Scikit-Learn库的分类方法总览

    译者丨野生大熊猫 https://mp.weixin.qq.com/s/hmNKdM3pA3Mq9vq0TQXgOg 简介 你是一个正在进入机器学习领域的Python程序员吗? 掌握Scikit-Le ...

  7. python输入名字、输出欢迎你_python笔记3-输出输入、字符串格式化

    输入.输出 python怎么来接收用户输入呢,使用input函数,python2中使用raw_input,接收的是一个字符串,输出呢,第一个程序已经写的使用print,代码入下: 1 2 name=i ...

  8. python导入标准库对象的语句_Python项目中如何优雅的import

    Python项目中如何优雅的import 前言 之前有一篇关于Python编码规范的随笔, 但是写的比较杂乱, 因为提到了import语句, 在篇文章中, 我专门来讲Python项目中如何更好的imp ...

  9. python的opencv库使用gpu加速_Python跳一跳:使用Cython加速opencv像素级访问

    简要概述 网上已经有很多Python实现的跳一跳辅助程序,有基于模版匹配的,还有基于深度学习端到端的方法,都很厉害.但是没有一种算法和我自己想的一样:寻找一行上与背景不一样的像素,找出其最值,当最值连 ...

最新文章

  1. js的defer属性
  2. CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
  3. 汽车行驶姿态 -- 初识
  4. 二十五、长短时记忆神经网络
  5. Ext 遍历树的所有节点
  6. react核心虚拟dom_使用虚拟时间测试基于时间的React堆核心流
  7. (转)Enterprise Architect 7.0入门教程
  8. 现代生活已经离不开的银行卡支付,背后原理其实没你想象的那么难!
  9. android 音频配置文件,Android音频系统
  10. python处理pdf文档_pyPdf - 用Python方便的处理PDF文档
  11. spring jdbc_Spring JDBC示例
  12. javaweb——jsp(学习总结,javaweb必备技能)
  13. 操作系统原理与实践-1熟悉实验环境
  14. 使用Visio 2003 + Oracle 11g创建ERD,反向工程师失败了吗?
  15. 搭建一个简单的服务器
  16. 【C语言】如何判断一个数字是否为素数(质数)?
  17. MIPI归纳---为什么阻抗为100欧姆
  18. 网易微专业python爬虫工程师一期多久_有木有人上过网易云课堂的 Python Web 微专业,怎么样?...
  19. 对比PAYPAL和国际信用卡支付的流程
  20. 2020.9.2丨遗传图谱产品类型

热门文章

  1. 用httpPost对JSON发送和接收的例子
  2. Android OpenGL ES(六)创建实例应用OpenGLDemos程序框架 .
  3. Icon资源详解[1]
  4. Machine type的匹配
  5. Ubuntu 安装arm-linux-gcc交叉编译工具
  6. ShotCut——视频处理剪辑神器
  7. 解决Tensorflow2.0出现:AttributeError: module 'tensorflow' has no attribute 'get_default_graph'的问题
  8. java scene_Java Scene類代碼示例
  9. 安装pkgconfig_一个R包怎么也安装不上,憋着急!
  10. raptor五个数排序流程图_看了这篇文章,我发现排序算法好简单