Python Wheel包中哪些是二进制文件?如何定位及校验源码一致性?
问题1解答
Python Wheel确实可以包含二进制文件,你拆解的Django-3.2.9-py3-none-any.whl属于纯Python通用Wheel,命名中的py3-none-any就代表仅支持Python3、无特定ABI要求、适配任意架构,这类Wheel本身就不会携带二进制文件,所以你找不到是正常的。
带二进制内容的Wheel通常是包含C/C++/Cython扩展的包,命名会携带明确的平台、ABI、架构标识,比如numpy-1.26.0-cp311-cp311-win_amd64.whl就是适配Windows 64位、Python3.11的带二进制的Wheel。
要定位Wheel里的二进制文件,直接搜索对应平台的二进制文件后缀即可:
- Windows系统下常见后缀:
.pyd、.dll - Linux系统下常见后缀:
.so - macOS系统下常见后缀:
.so、.dylib
这类二进制文件通常和普通Python模块放在同级目录,或者存放在包内的libs、bin专属子目录中。
问题2解答
你的猜测部分正确,但范围有偏差:*.dist-info/RECORD文件中存储了当前Wheel包内所有文件的哈希校验和,安装工具会在安装时校验每个文件的哈希是否和RECORD中记录的一致,这一机制可以保障你下载到的Wheel包内所有文件(包括源码、二进制、配置文件等)和打包者上传时的文件完全一致,没有被第三方篡改。
但注意:RECORD仅能保障包内文件的完整性,无法强制证明包里的二进制文件是由同包内的源码编译得到的。因为Wheel打包流程没有内置要求必须留存编译链路的溯源信息,打包者完全可以把外部编译好的二进制文件直接放入包内打包,这种情况下RECORD是校验不出问题的。如果要确认二进制和源码的对应关系,只能依赖包发布方公开可复现的构建流程自行验证。
内容的提问来源于stack exchange,提问作者Nasif Imtiaz Ohi

