一、学前花絮
我们已经学习了python语言的许多知识,包括数据结构、控制语句、函数、类/对象等,也学习了python处理一般文件、CSV文件、Excel文件等内容。而市场上的计算机语言超级多,特别是在windows系统下,大家为了与外部接口方便及工具封装的需要,都把一些对外接口。
API接口除了windows下的DLL(动态链接库)方式外,还有Linux下的SO、apple平台的Dylib等方式。所有的接口,都是为了完成两大功能,一是把自身的函数等封装隐藏起来,一是让别人可以很方便使用。
既然DLL动态链接库如此重大,我们下面予以详细介绍。
二、python调用windows的DLL接口文件
2.1 DLL是什么
DLL 就是 Windows 下的共享库文件(Dynamic-Link Library,动态链接库),里面一般放的是已编译的函数、过程、资源或类,供本机任意程序(EXE、脚本、其他 DLL)在运行时动态加载并调用。
所有 DLL 都是编译后的二进制库,DLL ≈ 本地 API:加载后可直接执行里面的函数,属于“接口”实现方式。
此外,DLL 不限于 C/C++,Delphi、Rust、Go 等也能生成,只要导出符号符合系统规范。导出内容不必定是“纯函数”,也可放数据段、类、资源,但 Windows 世界里最常见的用法就是“导出函数”供外部调用。
我们以DLL封装函数为例进行说明。
2.2 用标准C生成DLL文件
1.编写一个简单C程序,实现两个整数的加法和乘法:

C程序
C程序与Python最大的区别是要经过编译,而python语言是解释型语言,不需要编译,只需要解释器。换个角度看,C语言编译之后就是二进制文件,是不可读的。而python程序一般情况下是开放的,只需要机器上有解释器即可执行。当然如果非要把python程序编译,也是可以的,但编译后占用的空间很大。这个问题后来再说。
2.下载C编译器
- 进 GitHub 发行页
https://github.com/niXman/mingw-builds-binaries/releases
- 下 x86_64-14.x.x-release-win32-seh-ucrt-rt_v12 这类压缩包
- 解压到 C:mingw64,把 C:mingw64in 加入系统 PATH
- 新终端执行:gcc -shared -o add.dll add.c
执行以上命令后即可获得add.dll文件。里面封装了加法、乘法两个函数。
2.3 编写Python程序调用add.dll接口文件

Python调用dll文件
以上程序中,我们先导入ctypes模块,是python调用dll文件需要的模块。后面就是如何引入dll文件及输出。结果如下:

输出结果
当然一般的dll文件不会如此简单,但使用方式基本就是这样。我们掌握了这项技能,就可以用python语言实现许多外部接口功能了。
三、小结
我们在实际工作中,会遇到外部接口的情况。之前我们学过的Json也是一种接口,但属于数据接口,可以用来与外部程序交换数据。而今天学习的DLL动态链接库属于二进制API接口,用于封装函数、类等信息。这是行业内常常会遇到的情况。
我在前几天的工作中就遇到了这种事情,对方是生产一些特殊设备的厂商,我们需要读取对方设备产生的数据,而对方只是提供了DLL文件供我们调用,这种方式可以认为是对自己知识产权的一种保护。对于使用者来说也方便,由于不用了解DLL库内部的信息,只需要了解DLL库的使用方法即可。
让我们保持学习热烈,多做练习。我们下期再见!

快乐男孩
#python#