Wheel Guide

Wheel 是一种格式。Wheel 文件是一个 Zip 包,后缀是 .whl。Wheel 文件包含了Python 源代码,而非 Python 编译后的中间字节文件。Wheel 文件还包含了编译后的二进制代码,如果有的话。安装 Wheel 通常是非常快的,因为不用构建。

tl; dr

What is Wheel

Wheel 源自 PEP 426 (Metadata for Python Software Packages 2.0, use .dist-info instead .egg-info) 和 PEP 376 (Database of Installed Python Distributions, express dependencies), 遵循这些在 Egg 后才出现的标准。

Wheel 的设计宗旨是安装一个包可以通过 unzip 和 cp 完成:编译构建,是由包发行者来完成,且只需完成一次。 Wheel 是安装流程得到简化:用户安装 Python 包,只需要下载 Wheel 文件,解压到特定目录即可。 这个流程会导致以下一些后果:

  • 因为打出来的包 unzip + cp 就能完成安装,所以 setup.py 不那么重要了。反而在 Wheel 里一些 METADATA 会比较重要,它指定了包适用的环境与平台。
  • Wheel 只包含 Python 源代码,不包含 .pyc 文件,.pyc 文件是运行时生成的。

The Format of Wheel Package

Wheel 的文件遵循标准 PEP 0427 - The Wheel Binary Package Format 1.0。 它希望在构建和安装中间提供一个简单的接口,使安装不再需要知道构建系统的细节。 Wheel 文件 中的 .dist-info/WHEEL 声明了包的版本,是否是纯 Python 包等重要信息。 Wheel 文件的文件名包含了诸多重要信息,注入包名,版本,适用Python版本,适用平台,适用的ABI类型。

Wheel vs. Egg

  • wheel 是一个安装包,内含构建的产物,而 egg 则是可移植的包,需要目标机器上构建产物;
  • wheel 的内容放在 zip 包的 .dist-info 目录里; 而 egg 放在 .egg-info;
  • wheel 的文件命名含义更丰富;
  • wheel 包里有 wheel 的版本信息,egg 则没有
  • wheel 有 pep 标准,egg 没有
  • wheel 包 import 前需解压,egg 则不需要(对纯 Python 包而言)
  • wheel 包包含 python 源代码,egg 包含 python 字节码。
  • wheel 需要对不同的 Linux 平台发行不同的包,egg 则不需要(对非纯 Python 包而言)

Usage

构建 Wheel 包:

python setup.py bdist_wheel

安装时使用 Wheel 缓存:

  • pip install --use-wheel --no-index --find-links=http://wheelhouse.company.com
  • pip install --use-wheel --no-index --find-links=/path/to/wheelhouse

可以使用一款叫做 devpi 的软件镜像和缓存 PyPI 包,上传和下载私有 wheel 包。

References