首页/开发/CI/CD 与发布速查/Python 分发形态(wheel 与 sdist)
构建与制品管理58 条

Python 分发形态(wheel 与 sdist)

wheel(.whl)是预构建分发、安装快;sdist(.tar.gz)需要目标环境本地构建,易受系统依赖影响。

CI/CD 与发布速查开发更新于 2026-10-13

wheel 与 sdist 是什么

Python 两种分发形态:wheel(.whl)是预构建格式,安装时无需再编译;sdist(.tar.gz)是源码分发,安装时在目标环境执行构建步骤,容易受系统依赖与编译工具链影响。内部交付优先提供 wheel——把编译复杂度留在构建流水线,而不是部署机上。平台标签(如 manylinux)声明 wheel 兼容的 glibc 与平台范围。

基本信息

wheel预构建格式,安装时无需编译(除非纯源码包标注)
sdist源码分发,安装时执行构建步骤
平台标签manylinux 等标签声明兼容的 glibc/平台范围
构建命令python -m build 一次生成两种产物
选择内部交付优先 wheel;对外发布两者都提供

典型使用场景

  • 部署加速:CI 构建 wheel 后分发,部署机只安装不编译
  • 离线环境:预下载 wheel 及依赖,目标机无外网也能安装
  • 跨平台交付:按目标平台构建对应标签的 wheel
  • 缓存复用:wheel 进制品库,编译一次多处复用
  • 兼容排查:安装失败先看平台标签与环境是否匹配
  • 源码审计:需要审查构建内容时保留 sdist

构建与安装

构建与安装
python -m build   # 一次生成 dist/*.whl 与 *.tar.gz
pip wheel . -w dist   # 只构建 wheel 及其依赖的 wheel
pip install dist/app-1.9.0-py3-none-any.whl   # 直接安装预构建包
pip install --no-index --find-links dist app   # 离线从本地目录安装

产物类型读法

产物内容安装时行为
whl预构建归档解包复制,无编译步骤
tar.gz项目源码(sdist)先构建成 wheel 再安装
平台标签兼容范围声明标签不符则安装被拒
py3-none-any纯 Python 通用包任何平台可装
内部交付优先提供 wheel:把编译复杂度留在构建流水线,而不是部署机上。
manylinux 标签决定兼容边界:目标机 glibc 过老会装不上,构建镜像按最老的目标环境选。
wheel 与 sdist 成对保留:前者供安装,后者供审计,制品库按发布版本归档。
离线安装顺序:依赖 wheel 与主包一次给全,安装时指定本地目录,避免中途缺件。

团队协作

  • 私有索引:wheel 发布到内部索引,团队按版本安装复用

易错点

  • 部署机上从源码安装:缺少编译工具链的机器直接失败,提前构建 wheel
  • wheel 平台标签与目标环境不符:安装被拒或行为异常,核对 manylinux 版本
  • 只分发 wheel 不留源码:出问题无法审查构建内容,供应链审计需要 sdist
  • 构建与运行环境不一致:本地构建的 wheel 在低版本 glibc 上装不上,用与运行环境对齐的构建镜像

数据来源与参考

  • PyPA 文档《Python Packaging User Guide》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌