Skip to main content
https://github.com/amol-/consolidatewheels/actions/workflows/tests.yml/badge.svg https://coveralls.io/repos/amol-/consolidatewheels/badge.svg https://img.shields.io/pypi/v/consolidatewheels.svg https://img.shields.io/pypi/pyversions/consolidatewheels.svg https://img.shields.io/pypi/l/consolidatewheels.svg

Supported Platforms

  • Linux

  • OSX

  • Windows

Introduction

When multiple wheels depend on each other and share some .so files, it is possible to rely on auditwheel --exclude to make sure the .so is included in only one of the wheels to avoid duplicating the file in every package.

That allows Python wheels to share the same .so as far as at least one of them is loading them in memory. See https://github.com/pypa/auditwheel/issues/76 and https://github.com/pypa/auditwheel/pull/368 for discussions on the topic.

The problem with this approach is that the package where the .so is included will have the library name mangled by auditwheel, while the ones where it’s excluded will reference to the library with its original name.

Suppose you have libone.whl and libtwo.whl both depending on libfoo.so, and libone is a dependency of libtwo so you already know you can include libfoo.so only in libone.whl, you could do:

auditwheel repair dist/libone.whl
auditwheel repair dist/libtwo.whl --exclude libfoo.so

In such case you would end up with the following wheels:

venv/lib/python3.10/site-packages/libone
├── __init__.py
├── _libone.cpython-310-aarch64-linux-gnu.so
venv/lib/python3.10/site-packages/libone.libs
└── libfoo-ef63151d.so
venv/lib/python3.10/site-packages/libtwo
├── __init__.py
├── _libtwo.cpython-310-aarch64-linux-gnu.so

The problem would be that while _libone.cpython-310-aarch64-linux-gnu.so was patched by auditwheel to know about the libfoo-ef63151d.so name, _libtwo.cpython-310-aarch64-linux-gnu.so was not, and so still refers to the original name:

$ ldd venv/lib/python3.10/site-packages/libone/_libone.cpython-310-aarch64-linux-gnu.so
    libfoo-ef63151d.so => ../libone.libs/libfoo-ef63151d.so (0x0000ffff8f8f0000)

$ ldd venv/lib/python3.10/site-packages/libtwo/_libtwo.cpython-310-aarch64-linux-gnu.so
    libfoo.so => not found

Which means that trying to import libtwo will fail with:

ImportError: libfoo.so: cannot open shared object file: No such file or directory

Which makes sense, because we actually provided libfoo-ef63151d.so and not libfoo.so.

To solve this problem consolidatewheels will patch all provided wheels to make sure that they share a single naming convention for libraries that were mangled.

After consolidatewheels is used, the final result would be:

$ ldd venv/lib/python3.10/site-packages/libone/_libone.cpython-310-aarch64-linux-gnu.so
    libfoo-ef63151d.so => ../libone.libs/libfoo-ef63151d.so (0x0000ffff8f8f0000)

$ ldd venv/lib/python3.10/site-packages/libtwo/_libtwo.cpython-310-aarch64-linux-gnu.so
    libfoo-ef63151d.so => not found

which would work correctly as far as libone is imported _before_ libtwo as they will both look for libfoo-ef63151d.so which was loaded already by libone.

Linux Support

consolidatewheels works also in conjunction with auditwheel, consolidating all libraries embedded by auditwheel. But on Linux duplicates won’t be removed automatically, so you need to make sure to use auditwheel --exclude to ensure libraries are not embedded twice.

OSX Support

consolidatewheels works also in conjunction with delocate, consolidating all libraries embedded by delocate and removing duplicates of the embedded libraries when they are provided in multiple wheels.

Windows Support

consolidatewheels works also in conjunction with delvewheel, consolidating all libraries embedded by delvewheel and removing duplicates of the embedded libraries when they are provided in multiple wheels.

Install

Install with:

$ pip install consolidatewheels

Note that consolidatewheels requires patchelf to be available in the system, and it only works on Linux systems. But those are the same requirements that auditwheel has, so you are probably already satisfying them if you use auditwheel.

Usage

Usage instructions:

consolidatewheels --help

Example:

consolidatewheels libone.whl libtwo.whl --dest=./consolidated_wheels

For a more complex example and a testing environment, you can take a look at https://github.com/amol-/wheeldeps which uses consolidatewheels

Release files for consolidatewheels 0.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for consolidatewheels 0.5
File Size Uploaded
consolidatewheels-0.5.tar.gz 16.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for consolidatewheels 0.5
File Interpreter ABI Platform
consolidatewheels-0.5-py3-none-any.whl Python 3 none any Details

Total release size: 30.9 kB

Release files / consolidatewheels-0.5.tar.gz

Download URL consolidatewheels-0.5.tar.gz
Size 16.6 kB
Tags Source
SHA-256 checksum
How to use checksums
dfc2dcc333b38550cbcf1815336eec212f49a52653358043d99268266d33d4f4
BLAKE2b-256 checksum
How to use checksums
939701e13d6a214a0db3e411e359edb0c828c5a58e4ca8e4de21074d2da6751c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / consolidatewheels-0.5-py3-none-any.whl

Download URL consolidatewheels-0.5-py3-none-any.whl
Size 14.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
51160cad81a434f900a8bab42bccf58be8ba2016effafac3eb4e56e4fca1dae3
BLAKE2b-256 checksum
How to use checksums
c342a6d4bf60376db11f5404802ecdb28b5d3c70e191217033d027221dad7806
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release history Release notifications | RSS feed

This release

0.5 This release

2 release files

0.4

2 release files

0.3

2 release files

0.2

2 release files

0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page