python中怎么利用ctypes调用扩展模块

这篇文章给大家介绍python中怎么利用ctypes调用扩展模块,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

创新互联-专业网站定制、快速模板网站建设、高性价比威宁网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式威宁网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖威宁地区。费用合理售后完善,十多年实体公司更值得信赖。

python如何调用扩展模块

python调用扩展模块的一种比较简单的方式就是使用ctypes这个库,这个库是python官方提供的,任何一个版本的python都可以使用,我们通过ctypes可以很轻松地调用扩展模块。

演示

#include void test(){  printf("hello world\n");}

我们定义了一个很简单的函数,下面我们就可以将其编译成扩展模块了。在Windows是dll,linux上是so,编译的命令是一样的。我这里以Windows 为例,记得在Windows上要安装MinGW,或者安装VsCode,我这里使用的是MinGW,因为VsCode太大了。

gcc -o dll文件或者so文件 -shared c或者c++源文件

我这里的C源文件叫做1.c,我们编译成mmp.dll吧,所以命令就可以这么写:gcc -o mmp.dll -shared 1.c

下面就可以使用python去调用了。

import ctypes# 使用ctypes很简单,直接import进来,然后使用ctypes.CDLL这个类来加载动态模块# 如果在Windows上还可以使用ctypes.WinDLL。# 因为看ctypes源码的话,会发现WinDLL也是一个类并且继承自CDLL# 所以在linux上使用ctypes.CDLL,# 而在Windows上既可以使用WinDLL、也可以使用CDLL加载动态模块lib = ctypes.CDLL("./mmp.dll") # 加载之后就得到了扩展模块# 我们可以直接通过.的方式去调用里面的函数了,会发现成功打印lib.test() # hello world# 但是为了确定是否存在这个函数,我们一般会使用反射去获取# 因为如果函数不存在通过.的方式调用会抛异常的func = getattr(lib, "test", None)if func:  print(func) # <_FuncPtr object at 0x0000029F75F315F0>  func() # hello world# 不存在test_xx这个函数,所以得到的结果为Nonefunc1 = getattr(lib, "test_xx", None)print(func1) # None

所以使用ctypes去调用扩展模块非常方便

1.通过ctypes.CDLL("dll或者so的路径"),如果是Windows还可以使用ctypes.WinDLL("dll路径")。另外这两种加载方式分别等价于:ctypes.CDLL("dll或者so的路径") == ctypes.cdll.LoadLibrary("dll或者so的路径"),ctypes.WinDLL("dll路径") == ctypes.windll.LoadLibrary("dll路径")。但是注意的是:linux上只能使用ctypes.CDLL和ctypes.cdll.LoadLibrary,而Windows上ctypes.CDLL、ctypes.cdll.LoadLibrary、ctypes.WinDLL、ctypes.windll.LoadLibrary都可以使用。但是一般我们都使用ctypes.CDLL即可,另外注意的是:dll或者so文件的路径最好是绝对路径,即便不是也要表明层级,比如我们这里的py文件和dll文件是在同一个目录下,但是我们加载的时候不可以写mmp.dll,这样会报错找不到,要写成./mmp.dll。

2.加载动态模块之后会返回一个对象,我们上面起名为lib,这个lib就是得到的扩展模块了。

3.然后可以直接通过lib调用里面的函数,但是一般我们会使用反射的方式来获取,因为不知道函数到底存不存在,如果不存在直接调用会抛出异常,如果存在这个函数我们才会执行。

关于python中怎么利用ctypes调用扩展模块就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


本文名称:python中怎么利用ctypes调用扩展模块
转载来源:http://scyanting.com/article/pcedgo.html