python 编译成.pyd/.so

发布时间 2023-04-26 11:38:53作者: 一枚码农

所谓pyd文件,就是D语言(C/C++综合进化版本)编写的一种dll 文件,相比起容易被反编译的pyc文件,pyd文件目前还没有办法进行反编译,只能被反汇编,因此有很高的安全性,并且运行效率也比较高。

在windows会编译出pyd,linux会编译称.so


编译前准备

要想编译pyd,首先要通过pip安装Cython和setuptools库。

pip install cython
pip install setuptools

除了Cython和setuptools这两个python库以外,在windows上编译pyd,还需要安装Microsoft Visual C++ 14.0

pyd的编译

准备好编译环境后就可以进行编译了,首先创建一个用于编译的py脚本例如setup.py,内容如下

import os

import setuptools
from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension

extensions = []
if os.path.exists('./test.py'):
    extensions.append(Extension('test', ['test.py']))

setup(ext_modules=cythonize(extensions, compiler_directives={'language_level': 3}), )

其中的test.py就是要编译的python脚本,而language_level参数为2代表python版本为2.X,如果要打包python3.X版本时,这个参数应该为3。

test.py文件内容
image

最后再用python运行这个setup.py并加上两个参数,即可开始编译pyd。
python setup.py build_ext --inplace

image

image

image

对于python2.X版本,编译好的pyd文件名称和py文件相同,例如test.py编译完后为test.pyd;而对于python3.X版本,编译好的pyd文件会带有后缀,例如test.py用64位windows系统上的python3.7编译后是test.cp37-win_amd64.pyd,这个pyd名称不要修改,python在import库时会自动识别。

引用使用

删掉test.py文件,然后引用
image
执行结果
image