You should have a file at
If that's there, pip should use piwheels. If not, create the file and add those lines to it.
Note that pip version 9 or above is required.
You can use piwheels as an additional index,
which will allow pip to fall back to PyPI if the requested
package (or one of its dependencies) is not available on
piwheels, by using the
--extra-index-url option, for
sudo pip3 install numpy --extra-index-url https://www.piwheels.org/simple
Alternatively, to only use piwheels, use the
--index-url option, for example:
sudo pip3 install numpy -i https://www.piwheels.org/simple
sudo pip3 install numpy --index-url https://www.piwheels.org/simple
If your pip is configured to use piwheels, but you want to use
PyPI instead, you can either remove or comment out the
extra-index-url configuration in
/etc/pip.conf, or you can explicitly request no
binary distribution in the installation command, and you'll get
source distribution from PyPI, for example:
sudo pip3 install numpy --no-binary :all:
or to use the
--no-binary option for a single
package (e.g. get the tensorflow wheel but force a build of one
of its dependencies, grpcio):
sudo pip3 install tensorflow --no-binary grpcio
On Debian-based systems such as the Raspberry Pi OS, the
is Python 2, and
python3 is Python 3. Similarly,
pip is for
Python 2, and
pip3 is for Python 3.
The exception to this is is when using a Python 3 virtual environment, when
pip refer to your virtual environment's Python and pip.
Usually, it's good practice to use a virtual environment rather than the system Python. However, it's common to use the system Python on Raspberry Pi, because you can think of the whole SD card as a "virtual environment" in that you are likely to reimage the SD card regularly, or swap to a different SD card for a different project.
If you're using the system Python, use
sudo pip3 install numpy
If you're in an active a virtual environment, you use
and you don't use
pip install numpy
Alternatively, you can use the system Python but install packages for the current user only, which
pip3 install numpy --user
You can either specify the version you want:
sudo pip3 install numpy==1.18.0
Or you can use the
sudo pip3 install numpy --prefer-binary
This will install the latest version that's available as a wheel.
Time saved depends on the package requested, and the Raspberry Pi model used. Some packages usually require significant build time, which is avoided by using piwheels. Many packages are usually quite quick to install anyway, and only a small amount of time is saved. Build time on Pi 1 and Pi Zero is much longer than Pi 3 (roughly 6x), so the biggest gains are there.
You don't need to do anything. All package releases on PyPI are automatically processed by the piwheels project. As long as you upload a source distribution, we'll attempt to build it.
Some packages fail to build, for various reasons. If you would like to investigate, try building the package yourself on a Raspberry Pi 3 with a Lite image by running pip3 wheel <package>. If you find you are able to successfully build the package (for example, by installing some build dependencies), please open an issue on github and we'll try to resolve it. Also see the following answer.
You may discover that piwheels manages to build some versions of a package and fails to build others. Success and failure per ABI is noted on each package's project page. Search for a package on the package list page. If you maintain the package or otherwise have a solution for the build, please open an issue on github and we'll try to resolve it.
piwheels should notice the registration of a new package or version within about 10 seconds. How long it takes for that version to be built then depends on two factors:
So ultimately the time for a new release to appear can be anything from about 10 seconds up to several hours (for complex to build packages) or several days (when piwheels has a large backlog of packages to work through).
No. All wheels are built natively on the Raspberry Pi OS (formerly Raspbian) on Raspberry Pi 3 hardware.
All current Raspberry Pi models (as of May 2020) are supported:
Please also observe answers to questions relating to operating systems and Python versions.
Some packages build differently depending on the tools
available. For example, if the package
pyqt installed, the wheel will depend on
the user also having
pyqt installed. If it is built
pyqt, the user can use
If you find an issue with a package installed from piwheels, please submit an issue on GitHub.
piwheels supports Python 3 only. While most packages available will work in any version of Python 3, some packages are only compatible with the minor version with which they were built. We build using for the ABI of the Python 3 version distributed with Debian releases:
The source code for the piwheels project can be found on GitHub at github.com/piwheels/piwheels.
The piwheels project is hosted on a cluster of Raspberry Pi 3s provided by Mythic Beasts. The web pages and wheel files are served from a single Raspberry Pi, we use a separate VM to host the database, and use several other Raspberry Pis accross different OS versions to build wheels.
The original build run was completed by a total of 20 Raspberry Pis, and now a smaller cluster remains active, continuing to build new package releases.
First of all: check your pip configuration and confirm that
piwheels is in fact being used. You should see
If you are definitely using piwheels, it could be that while the package you installed was available on piwheels, perhaps one of its dependencies is not available, and requires downloading from PyPI and building from source. Reading the output from the pip command should tell you what's going on.
While the hardware in Raspberry Pi 1 and Zero is Armv6, Pi 2 is Armv7, Pi 3 and 4 are Armv8, the (32-bit) operating system images provided on raspberrypi.org are made to support all three architectures (and are compatible with all Raspberry Pi products to date) by operating in Armv6 userland.
However, wheels built on a Raspberry Pi 2/3/4 running the
32-bit OS are tagged
armv7l. Since wheels built on a
Raspberry Pi 3 will work on a Pi 4, 3, 2, 1 or Zero, we simply
provide Pi 3-built wheels renamed
armv6l, with a few
exceptions (some packages, like opencv and tensorflow, are built
with optimisations available on Pi 3/4).
Also see the following answer.
The repository at piwheels.org does not currently support the 64-bit version of the Raspberry Pi OS (currently in beta). We have plans to support it in future, but this requires a significant amount of work, and then rebuilding all wheels on the new architecture. Read more on the blog and issue #220.
The repository at piwheels.org does not support Ubuntu or other distributions. It's possible some wheels will work on other distributions, but we can't promise that they will. Wheels are built against certain shared libraries which we know are available to Raspberry Pi OS / Raspbian users too.
It would be possible for someone to run their own instance of piwheels to build wheels on and for another distribution, like Ubuntu. To those interested in doing this, please see the docs, and feel free to get in touch.
Some wheels may work on other Arm platforms, but we can't guarantee this. We only officially support Raspberry Pi OS / Raspbian on Raspberry Pi, but you may have success using wheels on other Debian-based distributions or other boards. We won't accept bug reports for unsupported platforms.
See the following answer.
Pure Python wheels will likely work, but there's a much smaller speed increase installing from wheels over source distribution. Packages requiring compilation are built for a specific architecture, so they will not be useful on non-Arm platforms and will be ignored. Assuming your pip configuration is set to fall back to PyPI, installation will continue from there, which may involve building from source. There's no harm in trying to use piwheels on a PC/Mac but it's not likely of any help.
No — we can't. Only package maintainers can upload files to PyPI. We don't recommend that package maintainers upload Raspberry Pi Arm wheels to PyPI in case they don't work on other Arm platforms. Raspberry Pi users have access to piwheels, so that should suffice.
PyPI now allows uploading Armv6 and Armv7 wheels, but we recommend that you don't upload Arm wheels to PyPI for incompatibility reasons and other complications.
Wheels built on a Raspberry Pi 3, although tagged
armv7l are not truly Armv7, and may be incompatible
with other Arm platforms. If your package is made exclusively for
the Raspberry Pi platform, there is no harm in uploading Arm
wheels to PyPI, and this will speed up the installation for users
who do not have pip configured to use piwheels. However, it is not
possible to upload two indentical wheel files with
armv7l platform tags, so the
second one will be rejected by PyPI.
If you intend for your package to be installed by users in multiple Arm platforms, you may be best not to upload Arm wheels to PyPI and instead leave Raspberry Pi users to get a wheel from piwheels, and leave other Arm platform users to build from source.
Open an issue on GitHub and we'll endeavour to remove it as soon as we can. In cases where it's not obvious that the requester owns the package to be removed, we may require further evidence that you are authorized to request its removal (e.g. posting as the GitHub owner of the project, or some similar standard of proof on the relevant hosting service).
Note that we only currently track package additions from PyPI upstream; we don't honour package removals from PyPI hence removals must be requested manually. Frankly, package removal is an area fraught with difficulty. Even if we remove a given package from piwheels there's no guarantee some downstream mirror hasn't already got it, or another mirror of PyPI. The best solution to ensure your users avoid a given release is to cut a new release of your package with a higher version number.
If you do request removal, please let us know if you'd like piwheels to avoid building future releases of your package. We can arrange this trivially via a skip flag in our database.
We only log downloads from piwheels.org, not from PyPI. If your package is pure Python, and you submit wheels to PyPI (as you should), users will get the file from PyPI, not from piwheels. The only downloads from piwheels for these packages will be if people are explicitly choosing to download from piwheels. You can use projects like pypistats.org to get the numbers from PyPI, and aggregate them.
Additionally, if your project is packaged for Debian, people could be installing your package with apt, rather than pip.
Packages built by piwheels may depend on the presence of certain shared libraries. This is resolved by installing apt packages which provide the required shared objects.
We calculate dependencies after building wheels, and show them on the package project pages.
It is possible to discover dependencies yourself using
apt-file. Read more about this
process on the piwheels
Sometimes you need to download wheels ahead of time, for installation later, or download the wheels you need using your PC, and then transfer them to a Raspberry Pi which is offline.
To download the wheels on a Raspberry Pi, for use on the same Pi model, it could be as simple as:
mkdir wheels cd wheels pip3 wheel <package>
To download the wheels using your PC, you will need to provide additional flags to specify the spec of the Pi. For example, Armv7 wheels (for a Pi 2/3/4) for Buster (cp37m):
mkdir wheels cd wheels python3 -m pip download --extra-index-url https://www.piwheels.org/simple --only-binary=:all: --implementation cp --platform linux_armv7l --abi cp37m --only-binary=:all: <package>
You'll need to alter the flags according to platform and ABI requirements.
Sometimes you need to install the Armv6 wheels, even if you're on a Pi 2/3/4, because you intend to use the SD card on multiple models, including Pi 1/Zero.
Note that in almost all cases, the Armv6 and Armv7 wheels are identical, and compatible on both architectures. The only exceptions are opencv and tensorflow.
To ensure the Armv6 wheels are installed on a Pi 2/3/4, you need to find the location of the Armv6 wheels, download them and rename them.
wget https://www.piwheels.org/simple/tensorflow/tensorflow-1.14.0-cp37-none-linux_armv6l.whl mv tensorflow-1.14.0-cp37-none-linux_armv6l.whl tensorflow-1.14.0-cp37-none-linux_armv7l.whl sudo pip3 install tensorflow-1.14.0-cp37-none-linux_armv7l.whl
Alternatively, simply install the packages as normal on a Pi 1/Zero.
This is a summary taken from a blog post How you can help.
We've seen some (very few) reports of hash mismatches when people are using piwheels. This seems to happen with the combination of large files and slow internet connections.
First of all, don't ignore the hash mismatch — it's important to verify that the file you downloaded is the file you were expecting.
You need to download the file, verify it, and install it manually:
pipto install directly from the file:
sudo pip3 install tensorflow-1.14.0-cp37-none-linux_armv7l.whl
.zipand try to open it as a zip file. If it opens correctly, it should look like a Python package. If it does, that means the hash mismatch is genuine, so please open an issue and understand the risk before proceeding to install it.
A new feature of the Simple Repository API, specified in PEP-345 allows package maintainers to specify Python version requirements when distributing a package. The relevant Requires-Python attribute is not currently supported by piwheels and the feature is being discussed in issue #208.
You may need to select an older version to install, and install it explicitly i.e:
sudo pip3 install package==1.2.3
or subvert piwheels, e.g:
sudo pip3 install package --no-binary package
If you delete a package or version from PyPI, it will also be deleted from piwheels, and any files relating to the package or version will be removed. In the case of version removal, the project page will be updated to remove the version in question. In the case of package deletion, the project page will be deleted.
Alternatively, package maintainers have the ability to "yank" releases from PyPI. Yanking a release allows authors to effectively delete a version's files, without breaking things for people who have pinned to exactly a specific version. Releases yanked from PyPI will be reflected in piwheels, both in the simple index and visually on the project page. Read more about "yank" in PEP-592.
Previously, piwheels did not remove packages or versions which were deleted in PyPI, but this is no longer the case.