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

在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(纵坐标数据)。该函数的声明如下图所示:

u=2030289650,3561565657&fm=173&app=25&f=JPEG?w=640&h=64

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

u=3899120537,628216163&fm=173&app=25&f=JPEG?w=640&h=230&s=BA83E54C0FA1916846E96D0F000070C1

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

Python中调用方法1

在Python中的调用方式如下:

u=90046969,1382210802&fm=173&app=25&f=JPEG?w=640&h=100

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

Python中调用方法2

在Python中的调用方式如下:

u=3325507686,965205689&fm=173&app=25&f=JPEG?w=640&h=100

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

完整的测试代码

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

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

u=535072106,1115609313&fm=173&app=25&f=JPEG?w=640&h=436&s=B29131C8CAA5B16C18D5C50F0000F0C3

运行结果如下图所示:

u=1507132149,2670665772&fm=173&app=25&f=JPEG?w=639&h=439&s=41459B42FBFCBE495C59DC1F000070C9

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

欢迎加关注,共同交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

妲己机器人怎么升级固件_台湾重金设计的3D妲己,亮瞎了

大家还记得前几天米醋分享的国内首档二次元选秀,遭网友疯狂吐槽:不知道怎么形容的丑!当米醋看到了这档综艺的宣传海报时瞬间被这一批选手的颜值所吸引!太魔幻了!没成想看到3D人物效果时米醋却被这盛世丑颜丑到裂开&…

go语言通道插入0_Go语言入门必知教程-通道

Golang提供了一种称为通道的机制,用于在协程之间共享数据。当函数作为协程执行并发活动时,需要它们共享资源或数据,通道便充当协程之间的管道(管道),提供一种确保同步交换数据的机制。需要在声明通道时指定数据类型,可…

aes加密字符串c++_springboot2.2.X手册:防抓包?快速实现API接口数据加密

溪云阁:专注编程教学,架构,JAVA,Python,微服务,机器学习等,欢迎关注上一篇:springboot2.2.X手册:redis的7种类型100个方法全解析有没有遇到这样子的接口,放到…

鸿蒙系统打造完备终端,搭载鸿蒙系统的手机很快推出,华为生态更加完善

2019年的8月9日,在华为开发者大会上华为向大家正式的发布了一款操作系统——鸿蒙系统。这个系统备受大家的关注,鸿蒙2.0的发布也在时刻期待中。因为在目前的操作系统中,华为的鸿蒙操作系统是仅次于安卓、ios的存在,而今日&#xf…

curl socket 访问_使用Curl、socket、file_get_contents三种方法POST提交数据 | 学步园

# <?php # /**# * Socket版本# * 使用方法&#xff1a;# * $post_string "appsocket&versionbeta";# * request_by_socket(facebook.cn,/restServer.php,$post_string);# */# function request_by_socket($remote_server,$remote_path,$post_string,$port …

html 标签 r语言,从R中的字符串中删除html标签

我正在尝试将网页源代码读入R并将其作为字符串处理。我正在尝试删除段落并从段落文本中删除html标签。我遇到了以下问题&#xff1a;我尝试实现一个功能来删除html标签&#xff1a;cleanFunfunction(fullStr){#find location of tags and citationstagLoccbind(str_locate_all(…

python给图片加半透明水印_Python 批量加水印就这么简单!

工作的时候&#xff0c;尤其是自媒体&#xff0c;我们必备水印添加工具以保护我们的知识产权,网上有许多的在线/下载的水印添加工具&#xff0c;但他们或多或少都存在以下问题&#xff1a; 在线工具需要将图片上传到对方服务器&#xff0c;信息不安全。 很多工具不具备批量处理…

html 选中状态,html默认选中状态

html中标签用法解析及如何设置selec标签定义和用法 select 元素可创建单选或多选菜单。当提交表单时&#xff0c;浏览器会提交选定的项目&#xff0c;或者收集用逗号分隔的多个选项&#xff0c;将其合成一个单独的参数列表&#xff0c;并且在将 表单数据提交给服务器时包括 nam…

nemesis什么车_nemesis是什么意思_nemesis的翻译_音标_读音_用法_例句_爱词霸在线词典...

全部报应Was he aiming at Bryant, his old nemesis and a favorite target in the past?他是不是暗指科比, 一直的“竞争对手”和过去最中意的目标?期刊摘选After the defeat of their old arch nemesis, the Turtle have grown apart as a family.在击败旧时强敌后, 忍者神…

wxpython制作表格界面_[Python] wxPython 菜单栏控件学习总结(原创)

1、总结 1、大体创建过程 1、创建一个 菜单栏 : menuBar wx.MenuBar()相当于这个白色地方&#xff0c;没有File这个菜单 2、创建 菜单 : fileMenu wx.Menu()这两个不是直接“用的”&#xff0c;叫菜单。既用来分类其他 菜单项 的文件夹样 3、创建 菜单项 : newItem wx.MenuI…

android 8三星note8,信息太多很烦琐?告诉你三星Note8有妙招

不知从何时开始&#xff0c;我们眼前的信息变得丰富而繁杂。简洁的新闻无需经过报纸过滤&#xff0c;发生数分钟已经城皆知。预测晴雨也无需依靠天气先生&#xff0c;点亮手机即可洞悉风雨。生活在信息时代的我们仅用几英寸的窗口观察世界&#xff0c;信息的洪流难免会遮蔽眼前…

realloc函_realloc(重新分配内存空间的函数)

在头文件中定义void * realloc(void * ptr&#xff0c;size_t new_size);重新分配给定的内存区域。它必须预先分配malloc()&#xff0c;calloc()或realloc()尚未释放与free或呼叫realloc。否则&#xff0c;结果是不确定的。重新分配由以下两者之一完成&#xff1a;a)ptr如有可能…

python做excel表格教程视频_基于Python实现excel表格读写

首先安装对应的xlrd和xlwt 打开cmd命令窗口输入pip install xlrd和pip install xlwt就可以安装。之后输入pip list检查是否成功配置&#xff1a;xlrd操作# 接下来就是常用的语法操作&#xff1a; excel_data xlrd.open_workbook(文件路径)#得到对应的工作表 sheet excel_data…

虚无鸿蒙哪个厉害,【图说鸿蒙】鸿蒙设定之七柱神(五)

原标题&#xff1a;【图说鸿蒙】鸿蒙设定之七柱神(五)七柱神玄冥神飞来流去本无心&#xff0c;无空无我混天尘。幻作人形深简出&#xff0c;不是老妪是海神。玄冥神 虚无荒海司掌海洋、流动之力 神威之色为蓝执掌海洋、流动之力的神&#xff0c;是神道“熵”的最高掌控者&#…

java lambda 排序_Java8特性:Lambda表达式之概念篇

Java自诞生已经有十几个年头了&#xff0c;目前也已经发布了第十三个大版本&#xff0c;其中Java8是常用的版本中最新的一个版本。而Java8最大的特性就是&#xff1a;Lambda表达式、函数式接口和Stream流。本篇我只介绍Lamda表达式的概念以及简单使用&#xff0c;至于别的我打算…

jq获取表格里的checkbox_Python抓取网页表格(一)

Python有很多包可以抓取数据&#xff0c;如selenium、requests、scrapy、pandas&#xff0c;每个包都有其适用性&#xff0c;个人认为在抓取数据时&#xff0c;代码简洁性和数据获取的准确性是需要考虑的因素&#xff0c;时间快慢倒不用太在意&#xff0c;毕竟用python抓数据本…

html一个空格多少像素,一个空格占几个字符?

一个空格通常占2个字符&#xff0c;但有些特殊情况占用3个字符。在程序中&#xff0c;空格占用的字符数取决于程序使用的字符集&#xff0c;如&#xff1a;1、使用多字节字符集时&#xff0c;半角空格占用1个字节&#xff0c;全角空格占用2个字节。2、使用Unicode字符集时&…

各种抠图动态图片_不用手。自动、智能抠图,图片去背景

BgEraser 是一款基于 AI 的自动、智能图片去背景工具&#xff0c;无需勾选可用、可删除区域&#xff0c;上传图片&#xff0c;立即下载即扣图完成的图片。AppinnBgEraser 真是懒人的福音。在此之前&#xff0c;比如很好用的在线去背景服务 remove.bg&#xff0c;是需要用户手动…

html用dom显示xml,html DOM文件引用一个XML文件将不会在浏览器中打印

我完全不熟悉这一点&#xff0c;我正在上课&#xff0c;现在变成了一个令人头疼的问题。我有这个HTML DOM文件&#xff0c;它引用了一个XML文件&#xff0c;我需要在浏览器中显示在屏幕上。它应该只打印标题&#xff0c;标题&#xff0c;第一个&#xff0c;最后一个&#xff0c…

bigdecimal 保留两位小数_Python的保留小数及对齐

Python的保留小数&#xff1a;方法1&#xff1a;用round函数(有坑)。median 12.3004886print(round(median, 2)) # 保留两位小数print(round(median, 3)) # 保留三位小数print(round(median, 4)) # 保留四位小数运行结果&#xff1a;12.312.312.3005可以看出Python中的r…