Python虽然作为一种解释性语言,通常是使用解释器处理脚本的方式完成工作,但是也具有和很多其他诸如C、C#语言等类似的方式,可以将.py文件编译为*.pyd文件,即Python动态链接库文件。
关于动态链接库的优缺点这里就不展开细说了,具体介绍如何编译及使用。要将Python文件编译成.pyd文件,可以使用Cython,以下是基本的操作步骤。
0. 环境准备
需要安装cython,这个使用pip就可以了:
pip install cython
1. 脚本准备
例如,有一个自己实现的计算平均值函数,例如,中位值平均滤波法,也就是俗称的削峰均值滤波,脚本名称为myfunc.py,内容如下:
def my_mean(x:list):
if len(x)<3:
return None
s=sum(x)-max(x)-min(x)
return s/(len(x)-2)
编写完成以后,将脚本文件的后缀修改为.pyx,即文件名为myfunc.pyx
2. 编写构建脚本
新建一个setup.py的脚本文件,内容如下:
from setuptools import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("myfunc.pyx")
)
3. 构建pyd文件
通过命令:
python .\setup.py build_ext --inplace
编译成pyd文件,顺利的话,中间过程如下图所示:
第3步不顺利的话,一般会碰到这个出错提示:
Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools":
https://visualstudio.microsoft.com/visual-cpp-build-tools/
这个通常的原因是缺少C++构建工具,详细的解决方案见如下链接:
https://blog.csdn.net/weixin_57344466/article/details/141201709
最后就会在相同文件夹下生成了一个名为myfunc.c的源文件和myfunc.cp312-win_amd64.pyd的文件,后者就是我们的目标pyd文件,后缀带有python版本信息和平台信息。
4. 文件测试
编写一个简单的Python脚本,例如tester.py:
# pyd文件测试
import myfunc
x=[-1,1,2,0,3]
k=myfunc.my_mean(x)
print(k)
输出结果为1.0,符合我们的预期。