Jun 01, 2021 Article blog
Python .whl
files (or wheels) are a rarely mentioned part of
python
but they are important to the installation process for
python包
If you've already installed
python包
with
pip
it's highly likely that wheels will make your installation faster and more efficient.
Wheels are an assembly of the
Python
ecosystem that helps make the installation of packages work properly. T
hey allow for faster installation and a more stable package distribution process.
In this tutorial, you'll learn more about what wheels are, what they offer, and how they appeal and make it easier to use
Python
(Recommended tutorial: python tutorial)
Before you learn how to package a project into wheels, it's helpful to understand what it's like to use them from a user's perspective.
You can start this experiment by installing a
Python包
in your environment as usual.
In this case, install
uWSGI 2.0.x
$ python -m pip install 'uwsgi==2.0.*'
2 Collecting uwsgi==2.0.*
3 Downloading uwsgi-2.0.18.tar.gz (801 kB)
4 |████████████████████████████████| 801 kB 1.1 MB/s
5 Building wheels for collected packages: uwsgi
6 Building wheel for uwsgi (setup.py) ... done
7 Created wheel for uwsgi ... uWSGI-2.0.18-cp38-cp38-macosx_10_15_x86_64.whl
8 Stored in directory: /private/var/folders/jc/8_hqsz0x1tdbp05 ...
9 Successfully built uwsgi
10 Installing collected packages: uwsgi
11 Successfully installed uwsgi-2.0.18
To fully install
uWSGI
pip
takes several different steps:
TAR
file called
uwsgi-2.0.18.tar.gz
which is compressed with
gzip
tarball
and builds a
.whl
file by calling
setup.py
uWSGI-2.0
.
18-cp38-cp38-macosx_10_15_x86_64.whl
。
pip
tar.gz tarball
retrieved by pip is a source distribution package, or
sdist
not a wheel.
In some ways,
sdist
is an antonym for wheels.
The source code release contains the source code. T
his includes not only
Python
code, but also the source code of any extensions bound to the package (usually written in
C
or
c++
For source distributions, the extension is compiled on the user side rather than on the developer side.
The source distribution also contains a metadata package that is located in a directory named
.egg-info
This metadata helps build and install packages, but users don't really need to do anything with it.
From a developer's point of view, a source distribution package is created when you run the following command:
$ python setup.py sdist
Now try installing a different package:
chardet
:
$ python -m pip install 'chardet==3.*'
2 Collecting chardet
3 Downloading chardet-3.0.4-py2.py3-none-any.whl (133 kB)
4 |████████████████████████████████| 133 kB 1.5 MB/s
5 Installing collected packages: chardet
6 Successfully installed chardet-3.0.4
You can see an output that is significantly different from
uWSGI
installation.
Download a
.whl
file directly from
PyPI
when you install
chardet
T
he wheel name is
chardet-3.0.4-py2.py3-none-any
whl
follows a specific naming convention that you'll see later.
From the user's point of view, and more importantly, when
pip
finds a compatible wheel on
PyPI
there is no build phase.
From a developer's point of view, the wheel is the result of running the following command:
$ python setup.py bdist_wheel
Why does
uWSGI
give you a source distribution while
chardet
provides a wheel? Y
ou can find out why by looking at the pages of each item on
PyPI
and navigating to the download file area.
This section shows you what
pip
actually sees on the
PyPI
index server:
uWSGI
provides only one source distribution (uWSGI -2.0.18 .tar.gz).
chardet
provides both a roulette wheel and a source code release, but
pip
prefers the roulette wheel if it is compatible with your system.
You'll see later how to determine compatibility.
Another example of compatibility checking for wheel installation is
psycopg2
which provides a large number of wheels for
Windows
but does not provide any wheels for
Linux
or
macOS
clients.
This means that,
pip
depending on your specific settings, pip-installed
psycopg2
can get a wheel or source distribution.
To avoid these types of compatibility issues, some packages offer multiple wheels, each for a specific
Python
implementation and the underlying operating system.
So far, you've seen some obvious differences between wheels and
sdist
but more importantly, their impact on the installation process.
(Recommended micro-course: python3 basic micro-course)
Above, you see a comparison between getting a pre-built wheel installation and downloading a
sdist
installation.
Wheels make end-to-end installation of
Python包
faster for two reasons:
wheels
the intermediate steps of building packages from the source distribution.
Almost
chardet
installing chardet requires only a fraction of the time it takes
uWSGI
H
owever, this is an unfair comparison because
chardet
is a significantly smaller and simpler package.
Using different commands, you can create a more direct comparison that shows how different the wheels are.
You can let
pip
ignore its tilt to the wheels via the
-no-binary
option:
$ time python -m pip install \
--no-cache-dir \
--force-reinstall \
--no-binary=:all: \
cryptography
This command calculates the installation time of the encryption package and tells
pip
use the source distribution package, even if a suitable wheel is available.
Includes:
all:
Make rules applicable to cryptography and all of its dependencies.
On my machine, it takes about 32 seconds from start to finish.
Not only does it take a long time to install, but building encryption also requires
OpenSSL
development header that can be used for
Python
Cryptography can now be reinstalled, but this time make sure
pip
uses
wheels
from
PyPI
B
ecause
pip
prefers wheels, this is similar to calling
pip install
completely without parameters.
But in this case, you can make the intention explicit by requiring the wheel - pure binary:
This option takes just over 4 seconds, or only one-eighth of the time it takes for cryptography and its dependencies to use the source distribution.
Here's a look at
Python Wheels