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

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

这次以具体的例子讲一下在Python中,如何使用ctypes模块调用DLL中的库函数。本文的编程系统环境是win7 64位,Python使用的版本是python2.7.14。

由于DLL中函数中传递的参数类型比较多样化,拟打算分三次讲解这部分内容,这次先讲传递数值、指针与字符串参数的情况,后面再分两次讲解传递结构体、数值数组等类型的情况。

DLL文件的加载

假定已经有了一个DLL文件“MyDll.dll”,其函数约定的调用方式为C调用(cdecl)方式,则Python中加载该dll文件的代码如下:

15404483712322176eb3656

其中,第1行是引入ctypes模块,第2行是采用C调用约定加载“MyDll.dll”文件,并将返回值赋给dll变量,后续调用该DLL文件中的函数时,会使用该变量定义要使用的具体函数。

另外,需要说明的是,若DLL函数的调用约定是标准调用约定(stdcall)方式,则DLL文件的加载代码改为如下:

dll = WinDLL('MyDll.dll')

DLL函数的调用——函数参数为数值情况

如对于“MyDll.dll”文件中的函数add,其函数声明如下:

15404483872642519a4dac1

该函数有两个int类型的输入参数数x和y,返回的两个数的和。其C语言的实现代码如下:

15404483979214f791e4317

在Python中的调用方式如下:

154044840877878fb980e2a

这个函数应该说是最简单的一个函数了,在第17行,直接使用第一步加载DLL后返回的名称dll,后面跟函数名字即可返回其值。

DLL函数的调用——函数参数为指针情况

对于上面的函数改进为add2,其函数C语言的实现代码如下:

15404484234490a700a2d61

此时函数有三个指向int类型的指针参数x、y、z,z为x和y的和。

在Python中的调用方式如下:

15404484340726384642f1b

其中,第20-22行定义了3个int型的变量x、y和z,初始值分别为2,3,0。第23行调用add2函数时,使用byref指明参数传递时为引用传递,对应着C语言的指针传递。函数运行后,使用z.value即可查看z的值。

也可以使用下面的代码调用:

1540448444881bc002bc512

上面代码中,第23-24行,在使用add2函数时,先将函数赋给一个变量add2,然后对其输入输出参数进行单独声明,使用POINTER声明为这三个参数为指向int类型的指针变量。

DLL函数的调用——函数参数为字符串情况

例1:

如对于下面的函数,返回一个输入字符串的字节长度,其函数C语言的实现代码如下:

1540448459995c0e304b427

在Python中的调用代码如下:

154044847101707e41f6086

其中,第33行使用c_char_p定义了一个指向char型的指针变量pStr,并赋初值为’abcdef’,第34行将其传入GetStringLength函数返回其长度。

也可以使用下面代码调用:

1540448481695e80578052d

将GetStringLength函数的输入输出参数分别使用argtypes和restype单独进行声明。

例2:

如对于下面的函数,输入输出皆为字符串指针,函数的功能是对于输入pStr1赋值为“StrIn”,对于输出返回一个指向字符串常量“strOut”的指针,其函数C语言的实现代码如下:

1540448511145ae93a093be

在Python中的调用代码如下:

154044852154110fe689bbc

在上面代码中,同样分别对输入输出参数进行了声明。对于输入参数pStr,使用create_string_buffer函数定义了一个字符串缓冲区。对于返回值pChar,在打印输出结果时,将其强制转换为c_char_p类型,取其value值即可。

完整的测试代码

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

1540448530114b59943a17a

运行结果如下图所示:

15404485398274e9ec87ef9

总结

这次的例子基本涵盖了在Python中通过ctypes模块调用DLL函数时,传递数值、指针、字符串类型参数时的大部分情况。要注意的是,使用ctypes映射C语言中的数据类型时,两者必须完全一致。下面是Python的ctypes模块中数据类型与C语言中数据类型对照表:

1540448549674ea6e100da6

欢迎加关注,共同交流。

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

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

相关文章

沁恒CH554 KEIL环境搭建

首先下载WCHISPTool_Setup.exe http://www.wch.cn/products/CH554.html 123这三个可下载的都下吧,后面开发都要用的 安装好后运行,菜单栏上,功能->添加WCH MCU到KEIL器件库 这时候在KEIL安装目录里面的UV4文件夹下可以看到wch.cdb的文件…

【CV论文阅读】Rank Pooling for Action Recognition

这是期刊论文的版本,不是会议论文的版本。看了论文之后,只能说,太TM聪明了。膜拜~~ 视频的表示方法有很多,一般是把它看作帧的序列。论文提出一种新的方法去表示视频,用ranking function的参数编码视频的帧序列。它使用…

java不要在常量和变量中出现易混淆的字母

public class proposal {public static void main(String[] args) {long i1l; System.out.println("i的两倍是:"(ii));System.out.println("i的两倍是:"ii); //注意此处和上面的有很大的区别} }输出:211/** 注意:* …

VS2019 WPF制作OTA上位机(一)新建工程

首先创建新项目,文件 -> 新建 -> 项目 下拉菜单选择C#和Window,选择WPF应用程序,下一步 输入项目名,下一步 这里选择.NET 5.0,也可以选择其他的,个人习惯.NET,点击创建 这时候出现初始…

户籍恢复需要体检吗_脑梗死后脚麻能恢复吗?需要多久能恢复呢?

脑梗死之后脚部麻木,这个有一部分是能够恢复的,但是相对而言,恢复的时间比较长,在临床当中出现脚麻主要是因为梗死破坏了患者的感觉神经中枢从而造成。脚部感觉麻木,瘙痒或者是有蚂蚁在上面爬的感觉。而且有的更加严重…

Alpha版本测试报告

一、测试计划 Alpha版本即将发布,我们组织队员进行这一版本的测试。 测试主要针对两方面:浏览器兼容性和功能完善性。 测试分兼容性测试与功能完善性两部分,兼容性测试分Windows操作系统、Linux系操作系统、Mac OS X操作系统以及手机端Androi…

在J2SE应用程序中模拟CDI的会话和请求范围

我们目前正在考虑将Naked Objects框架重构为使用JSR-330(依赖注入)和面向EE的老大哥JSR-299(CDI)。 使用香草JSR-330是不费吹灰之力的,但是我们想利用JSR-299中的一些不错的功能(例如事件和装饰器&#xff…

VS2019 WPF制作OTA上位机(二)获取bin文件路径

OTA升级是通过无线通信远程把bin文件内容传输到单片机,完成升级。 因此上位机需要获取bin文件的路径,读取bin文件内容,将内容分割依次发送(因为单片机的接收缓存不会开得和bin文件一样大(十几K甚至几十K)&a…

java 线程“生产/消费”模型1

/*资源类*/ public class ShareValue {private int total;public ShareValue(int total){this.totaltotal;}//生产void putValue(int value){totalvalue;}//消费资源int getValue(int value){if(total-value>0){total-value;}else{valuetotal;total0;System.out.println(&qu…

PHP - 代码分离

总代码&#xff1a; <?php/** Version&#xff1a;1.0* CreateTime&#xff1a;2015年11月11日* Author&#xff1a;HF_Ultrastrong*///引入公共文件,在公共文件中创建&#xff0c;相对于项目的绝对路径require dirname(__FILE__)./includes/common.inc.php; ?&…

原生js封装table表格操作,获取任意行列td,任意单行单列方法

V1.001更新增加findTable-min.js 本次更新&#xff0c;优化了代码性能方面&#xff0c;增加了部分新功能&#xff0c;可以获取多个table表格批量操作。 考虑到本人后面的项目中可能涉及到大量的表格操作&#xff0c;提前先封了 一个简单的操作方法&#xff0c;日后再加完善&…

Spring陷阱:事务测试被认为是有害的

Spring杀手级功能之一是容器内集成测试 。 尽管EJB多年来一直缺乏此功能&#xff08;Java EE 6终于解决了这个问题&#xff0c;但是我还没测试过&#xff09;&#xff0c;但是Spring从一开始就允许您从Web层开始&#xff0c;通过所有服务来测试整个堆栈。到数据库的方式。 数据…

python xlwt写入已有表_Python中,添加写入数据到已经存在的Excel文件

1.安装xlrd、xlwt、xlutilshttps://pypi.org/project/xlutils/pip安装&#xff1a;cmd下输入&#xff1a;pip install xlrd #读取exclepip install xlwt #写入exclepip install xlutils #操作 Excel 文件的实用工具&#xff0c;如复制、分割、筛选等2.代码主要部分实现import x…

java线程“生产/消费”模型2

/* 资源类 */ class ShareValue {private int total;//判断对象是否为空private boolean isEmptytrue;//判断对象是否已满private boolean isFulltrue;public ShareValue(int total) {this.total total;if(total>0) isEmptyfalse;if(total<1000) isFullfalse;}/** sync…

linux更改用户名_破旧安卓手机第二春,在安卓手机上使用Linux_deploy运行Linux

由于服务器位于国外&#xff0c;害怕被墙掉导致数据丢失&#xff0c;所以在本地写了脚本每小时从服务器上导出并下载到本地。但是电脑不可能二十四小时开机&#xff0c;所以很想买一个树莓派4玩玩。但是太贵辽&#xff0c;还好搜索到了Android运行Linux的方法&#xff0c;下面记…

关于Cocos2d-x中init方法和onEnter方法的区别

init()和onEnter()这两个方法都是写实例化对象的类(比如继承自Node的一些类等等)的时候用到的方法。 一般都是public类型下面的 bool init(); void onEnter(); 两个方法在实现的时候都要先执行父类方法&#xff0c;比如 Node::init(); Node::onEnter(); 注意&#xff1a; 1.ini…

在5分钟内在MacOSX Lion中设置JAVA_HOME,MAVEN_HOME,ANT_HOME

人们一直试图通过Mac上的Java开发世界来解决这个问题&#xff0c;这一直是我一直遇到的问题。 他们必须解决的第一件事就是设置适当的工具和环境。 幸运的是&#xff0c;足够多的MacOSX &#xff08;Lion或以前的版本&#xff09;仍然有许多重要的工具可用于Java开发&#xff0…

MCUXpress IDE常用设置

NXP的开发工具Xpress是基于eclipse制作的&#xff0c;我们如果需要设置一些东西可以直接搜索eclipse是怎么设置的。 1、字体大小 搜索eclipse字体大小&#xff0c;菜单Window > Preference 而Xpress是汉化了的&#xff0c;英语不好的同学可能懵逼&#xff0c;其实就是菜单栏…

C语言中空格符、空字符、字符数组结束符、换行、回车的区别

空格符和空字符是不一样的,在ASCII里面,空格(space)符号的ASCII码是32,而空字符是0, 2个是完全不一样的2个字符 空字符 一般来描述一个字符串的结尾,其实是控制符的一种,但不能理解为没有字符,应该理解为代表什么都没有的字符.好比回车0x0A和换行0x0D虽然不显示,但是也是控制字…

hdu5823 (附带数的二进制子集)

二进制数子集的取法,结果不会输出0&#xff0c;且从大到小 for(int i0 i;i0;i0(i0-1)&i)cout<<i0<<endl; 题意&#xff1a; 给定一个 N个点的图&#xff0c; 求它的每一个子图的最小染色数 染色方法是所有子图中相连接两点颜色不一致 其中 N≤18 题解&…