如何通过setup.py用Cython编译Cryptography并打包含依赖的.pyd文件?
实现方案(Windows 10平台)
可以实现将foo.pyx打包为包含cryptography依赖的分发包,让用户无需自行安装cryptography。以下是两种可行的实操方法:
方法一:直接打包依赖文件与.pyd一同分发
这种方式适合直接交付.pyd文件给用户,无需通过pip安装:
编译自身代码为.pyd
执行命令编译foo.pyx生成对应的.pyd文件:python setup.py build_ext --inplace编译完成后,你会得到类似
foo.cp310-win_amd64.pyd的文件(文件名中的Python版本和架构根据你的环境变化)。收集cryptography依赖文件
- 找到本地Python安装目录下的
Lib\site-packages\cryptography文件夹,复制整个目录; - 找到Python安装目录下
DLLs文件夹中的OpenSSL相关动态库:libcrypto-*.dll和libssl-*.dll(版本号需与你当前使用的cryptography依赖的OpenSSL版本一致)。
- 找到本地Python安装目录下的
整理分发结构
将你的.pyd文件、复制的cryptography文件夹、以及两个OpenSSL DLL放在同一目录下。用户使用时,只要该目录在Python的sys.path范围内,就能直接导入你的.pyd并运行,无需额外安装依赖。
方法二:修改setup.py打包成包含依赖的安装包
如果需要通过pip安装的方式分发,可修改setup.py如下(但本质还是会自动安装依赖,适合允许用户通过pip安装但无需手动指定cryptography的场景):
from setuptools import setup from Cython.Build import cythonize setup( name="foo_package", ext_modules=cythonize("foo.pyx"), install_requires=[ "cryptography==x.y.z" # 替换为你实际使用的cryptography版本号 ] )
执行python setup.py bdist_wheel生成wheel包,用户安装该包时会自动拉取并安装指定版本的cryptography。
关键注意事项
- 必须保证收集的
cryptography版本、OpenSSL DLL版本,与你编译.pyd时使用的版本完全一致,否则会出现模块加载错误; - .pyd文件与Python版本强绑定,需针对目标用户的Python版本编译对应的文件,避免版本不兼容。
内容的提问来源于stack exchange,提问作者Ojas_Gupta
相关产品推荐
相关产品推荐

