跳转到主要内容

将多个轮的共享对象依赖关系进行整合

项目描述

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

支持的平台

  • Linux

  • OSX

  • Windows

简介

当多个轮依赖彼此并且共享一些.so文件时,可以通过使用auditwheel --exclude来确保.so文件只包含在一个轮中,以避免在每个包中重复文件。

这允许Python轮共享相同的.so文件,只要其中至少一个在内存中加载它们。有关该主题的讨论,请参阅https://github.com/pypa/auditwheel/issues/76https://github.com/pypa/auditwheel/pull/368

这种方法的缺点是,包含.so文件的包将由auditwheel进行名称修改,而排除的包将引用具有原始名称的库。

假设你有libone.whllibtwo.whl都依赖于libfoo.so,并且libonelibtwo的依赖项,所以你知道你只能将libfoo.so包含在libone.whl中,你可以这样做

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

在这种情况下,你会得到以下轮

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

问题是,虽然_libone.cpython-310-aarch64-linux-gnu.soauditwheel修改以了解libfoo-ef63151d.so的名称,但_libtwo.cpython-310-aarch64-linux-gnu.so没有被修改,所以仍然引用原始名称

$ 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

这意味着尝试导入libtwo将会失败

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

这是有意义的,因为我们实际上提供的是libfoo-ef63151d.so而不是libfoo.so

为了解决这个问题,consolidatewheels 将修补所有提供的轮子,确保它们对被破坏的库使用单一命名约定。

使用 consolidatewheels 后,最终结果将是

$ 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

这将正常工作,只要 libonelibtwo 之前导入,因为它们都会查找已经被 libone 加载的 libfoo-ef63151d.so

Linux 支持

consolidatewheels 也可以与 auditwheel 结合使用,合并 auditwheel 嵌入的所有库。但在 Linux 上,不会自动删除重复项,因此您需要确保使用 auditwheel --exclude 来确保库不会被多次嵌入。

OSX 支持

consolidatewheels 也可以与 delocate 结合使用,合并 delocate 嵌入的所有库,并在多个轮子中提供嵌入的库时删除重复项。

Windows 支持

consolidatewheels 也可以与 delvewheel 结合使用,合并 delvewheel 嵌入的所有库,并在多个轮子中提供嵌入的库时删除重复项。

安装

使用以下命令安装

$ pip install consolidatewheels

请注意,consolidatewheels 需要系统中有 patchelf,并且它只在 Linux 系统上工作。但这些是 auditwheel 的相同要求,所以如果您使用 auditwheel,您可能已经满足这些要求。

用法

用法说明

consolidatewheels --help

示例

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

对于更复杂的示例和测试环境,您可以查看使用 consolidatewheelshttps://github.com/amol-/wheeldeps

项目详情


下载文件

下载适合您平台的项目文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

consolidatewheels-0.4.tar.gz (16.2 kB 查看哈希)

上传时间

构建分发

consolidatewheels-0.4-py3-none-any.whl (14.3 kB 查看哈希)

上传时间 Python 3

由以下赞助

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面