在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件的功能及应用领域,减少重复编写代码、重复造轮子的工作量,这也充分体现了Python语言作为一种胶水语言所特有的优势。

前面两篇已经讲了传递数值/指针/字符串参数、传递结构体参数的例子,大家可以回看一下,这样可以更好的理解本次要讲的内容。详细细节请参考:python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数、Python使用ctypes模块调用DLL函数之传递结构体参数

这次讲一下在Python中使用ctypes模块调用DLL中的库函数传递数组参数的情况。一般情况下,DLL函数中传递C语言类型的数组,在接收到Python语言中时,通常将其转换为numpy库里面的数组类型,这样做的好处是可以借助于numpy强大的分析处理功能对数据直接作后续处理。这次通过例子演示下C语言数组到numpy数组之间是怎样传递的。

同样,操作系统环境是win7 64位,Python使用的版本是python2.7.14,函数约定的调用方式为C调用(cdecl)方式。

例子说明

在DLL文件中设计一个函数GenSine,其功能是根据给定的参数(包括数据点数N、信号频率f、采样频率Fs、信号幅值A、初始相位initPhase、偏移offset等参数)产生一个正弦波形数据,返回时间向量数组x(横坐标数据)和波形数据y(纵坐标数据)。该函数的声明如下图所示:

函数GenSine的具体C语言实现代码如下:

下面给出两种Python中转为numpy数组的调用方法。

Python中调用方法1

在Python中的调用方式如下:

上面的代码中在声明函数的参数类型时,对于前两个参数x和y数组变量,将其声明为指向double类型的指针即可。在调用该函数时,先声明两个numpy库中的数组t1、y1,数据类型为float64,将其作为参数传递到该函数中时,使用的是numpy中的ctypes.data_as(POINT(c_double))转化为C语言中的指向double类型的指针类型,这样就可以实现numpy中数组与C语言数组中的完美转换。

Python中调用方法2

在Python中的调用方式如下:

与第1种方法不同的是,这种方法在声明函数的参数类型时,对于前两个参数x和y数组变量,使用np.ctypeslib.ndpointer(dtype=np.float64,ndim=1,flags="C_CONTIGUOUS")直接将numpy中的数组声明为C语言中的数组类型,最后调用时,直接将将numpy中的数组类型t2和y2传到该函数中即可。相比于第1种方法,虽然在声明时麻烦些,但在调用时可以直接使用numpy中的数组类型,相对来说要简洁些,毕竟函数声明只需声明一次即可,但调用函数可能会在程序中出现多次。

完整的测试代码

在测试程序中,使用了pyqtgraph库画两种方法产生的正弦波形图,不明白的可以翻看下前面的文章,专门介绍了该库的画图方法。详细可参考:Python使用pyqtgraph库实现数据可视化之多条曲线绘制方法

完整的测试代码如下图所示:

运行结果如下图所示:

从运行结果可以看出,两种调用方法,都可以实现C语言数组与numpy数组之间数据正确的传递。相比来说,第2种方法更简洁些。

欢迎加关注,共同交流。

c调用python第三方库_Python使用ctypes模块调用DLL函数之C语言数组与numpy数组传递...相关推荐

  1. python调用c函数传字符串参数_Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数...

    在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件 ...

  2. c调用python第三方库_c/c++调用python程序且含tensorflow第三方库

    对于纯python程序而言,用c程序来调用是比较适合的,如果python程序中包含了其他第三方库,则调用极可能出错,且不易查明原因.如笔者曾用c程序调用包含tensorflow的python程序,有的 ...

  3. c调用python第三方库_用 Python ctypes 来调用 C/C++ 编写的第三方库

    看到一篇简洁的文章--如何用Python ctypes调用C++(ctypes调用C没这么多麻烦事),不敢独享... 如果需要用 Python 调用 C/C++ 编写的第三方库(这些第三方库很可能就是 ...

  4. 艺赛旗RPA 第三方库系列(一):如何调用 Python 第三方库

    目前艺赛旗RPA已经更新到8.0版本,可以让所有用户免费下载试用http://www.i-search.com.cn/index.html?from=line1 (复制链接下载) 当你需要调用使用 p ...

  5. python安装成功第三方库但import出问题_为什么会在pyspark在RDD中调用python第三方库失败?...

    问题描述 Hi, 我在公司线上运行pyspark时调用jieba分词, 发现可以成功import, 但是在RDD中调用分词函数时却提示没有 module jieba, 在本地虚拟机时没有这些问题 问题 ...

  6. python rsa库_Python中rsa模块【sign 加签验签】的使用

    安装 pip install rsa 使用一 说明:简单入门使用  使用公钥加密  ----------->> 使用私钥进行解密 1 #-*- coding:utf-8 -*- 2 imp ...

  7. 自动安装第三方库python,python第三方库自动安装脚本

    #python第三方库自动安装脚本,需要在cmd中运行此脚本 #BatchInstall.py import os libs = {"numpy","matplotlib ...

  8. python的标识库和第三方库_Python 标准库、第三方库

    Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具.这些库可用于文件读写.网络抓取和解析.数据连接.数清 ...

  9. python网络爬虫的第三方库_Python常用第三方库_网络爬虫、数据分析与WEB开发、机器学习...

    Python语言有超过12万个第三方库,覆盖信息技术几乎所有领域.下面简单介绍下网络爬虫.自动化.数据分析与可视化.WEB开发.机器学习和其他常用的一些第三方库,如果有你感兴趣的库,不妨去试试它的功能 ...

最新文章

  1. 研究生实名举报深圳大学导师强迫学生延迟毕业,违规报销,各方回应
  2. 2016012075 谢月月 散列函数的应用及其安全性
  3. arcgis字段计算器利用python按两列要求编号
  4. 常见的字符函数与字符串函数介绍(1)
  5. 未成年人互联网普及率达99% 腾讯等倡议加强青少年网络素养教育
  6. python 随机颜色
  7. SVN下载及其安装配置
  8. android 名片识别软件,手机名片识别工具Android名片全能王评测
  9. 果粉沸腾,iPhone6领衔苹果最顶级明星阵容
  10. android自动改,【玩机组ROM修改教程】自己修改安卓ROM 刷机包教程
  11. 工作中要怎样与同事相处呢?
  12. device-mapper 块级重删(dm dedup) 3代码结构(2)
  13. accessible: module java.base does not “opens java.lang“ to unnamed module
  14. 利用代码审查元素解除百度云客户端限制方法
  15. 有视频下载链接, 如何在浏览器上直接倍速观看?
  16. 射频滤波器设计软件简略
  17. 软件架构场景之—— 分表分库:单表数据量大读写缓慢如何解决?
  18. 【Python中应用Winsorize缩尾处理的心得】
  19. 金山快盘+TortoiseSVN构建版本控制仓库
  20. adb + bat 脚本实现自动化测试

热门文章

  1. 互联网大佬马老师于昨日教师节正式卸任,让位现任CEO张勇;华为发布新一代CloudLink视讯解决方案,普惠4K+AI;联通……...
  2. OpenStack精华问答 | OpenStack服务介绍
  3. 一拍即合、一见钟情之后,智慧城市的“福利”来啦……
  4. vue 集成 sweetalert2 前端校验
  5. 项目管理过程组和知识领域 简介重点记忆
  6. linux 修改当前系统时间
  7. linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(安装常用工具_02)
  8. MyBatis-Plus_更新操作
  9. Java并行流 No thread-bound request found
  10. 软考 - 法律法规 标准化