在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文件的代码如下:

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

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

dll = WinDLL('MyDll.dll')

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

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

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

在Python中的调用方式如下:

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

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

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

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

在Python中的调用方式如下:

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

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

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

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

例1:

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

在Python中的调用代码如下:

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

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

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

例2:

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

在Python中的调用代码如下:

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

完整的测试代码

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

运行结果如下图所示:

总结

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

欢迎加关注,共同交流。

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

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

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

  2. python创建字典和包的区别_python之路—模块和包

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  3. [python3 实用教程]使用ctypes模块调用运行c代码

    [python3 实用教程]使用ctypes模块调用运行c代码 创建c文件 demo.c: #include<stdio.h>long my_app(long a){long ret = ...

  4. python调用dll函数指针_python使用ctypes库调用DLL动态链接库

    最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用. ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调 ...

  5. 函数传参字典_Python 函数参数解包

    做一个简单.明亮.快乐的手艺人. 函数参数解包(Function Argument Unpacking)是在函数传参时将iterable参数对象中的元素解包出来的一种技术. 想象一个场景,当函数所有实 ...

  6. python库_python使用ctypes库调用DLL动态链接库_python

    最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用. ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调 ...

  7. python编程入门教程第6讲_Python开发的入门教程(六)-函数

    介绍 本文主要介绍Python中函数的基本知识和使用 Python之什么是函数 我们知道圆的面积计算公式为: S = πr² 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同 ...

  8. python中search和match的区别_Python中正则表达式match()、search()函数及match()和search()的区别详解...

    match()和search()都是python中的正则匹配函数,那这两个函数有何区别呢? match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找 ...

  9. python中函数startswith的用法_Python中的startswith和endswith函数使用实例

    在Python中有两个函数分别是startswith()函数与endswith()函数,功能都十分相似,startswith()函数判断文本是否以某个字符开始,endswith()函数判断文本是否以某 ...

最新文章

  1. linux 权限 x 表示,在Linux系统中,用户对目录拥有“x”权限,表示可以执行下列哪种操作?...
  2. topic是短语还是句子_英语七下unit 5 topic 3短语句子
  3. MySQL Execution Plan--执行计划中的Type列
  4. 详细分析图像形态学操作
  5. 【学习总结】Markdown 使用的正确姿势
  6. lede 插件_【PS插件】神器在手不怕图片模糊
  7. struts2+hibernate3.3+spring3.0 实现零配置
  8. HDFS中JAVA API的使用
  9. 传智黑马java基础学习——day11(接口、多态)
  10. 如何把iPhone投屏到Mac屏幕上进行演示和录制?
  11. 3dmax中如何解决镜头穿透模型?
  12. 360免费wifi设置位置服务器,win10系统使用360免费wifi的操作方法
  13. CHD5.3.6在线安装和维护踩坑指南
  14. 修改Linux swap大小,LINUX操作系统如何调整SWAP大小
  15. 测试的意义并不是能找到全部的缺陷
  16. python菜鸟教程官网绘图-Python Tkinter 画布(Canvas)
  17. 读书|林曦:她把自己的生活,过成了无用但丰盈的美学
  18. Android 仿小米的全面屏手势-侧滑返回
  19. Maven学习笔记__上篇
  20. 详解CSS设置默认字体样式

热门文章

  1. php中得到复选框的数据的代码,表单复选框向PHP传输数据的代码
  2. 报名照片审核处理工具_太浦军考|2020年文职人员报名照片审核程序,照片处理工具应该如何使用?...
  3. 如何恢复被删短信_手机便签记事本的内容如何恢复?快试试这款好用的便签
  4. 孙叫兽进阶之路之如何进行情绪管理
  5. 表单新增元素与属性(control、placehoulder、list、AutoComplete、pattern、SelectionDirection、indeterminate属性)
  6. h1、h2、h3标签及strong标签对页面seo的影响
  7. CSS3与页面布局学习笔记(二)——盒子模型(Box Model)、边距折叠、内联与块标签、CSSReset
  8. 移动优先的响应式布局
  9. Maven打包时去掉项目版本号
  10. Collections.sort的使用