将多个轮的共享对象依赖关系进行整合
项目描述
支持的平台
Linux
OSX
Windows
简介
当多个轮依赖彼此并且共享一些.so文件时,可以通过使用auditwheel --exclude来确保.so文件只包含在一个轮中,以避免在每个包中重复文件。
这允许Python轮共享相同的.so文件,只要其中至少一个在内存中加载它们。有关该主题的讨论,请参阅https://github.com/pypa/auditwheel/issues/76和https://github.com/pypa/auditwheel/pull/368。
这种方法的缺点是,包含.so文件的包将由auditwheel进行名称修改,而排除的包将引用具有原始名称的库。
假设你有libone.whl和libtwo.whl都依赖于libfoo.so,并且libone是libtwo的依赖项,所以你知道你只能将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.so被auditwheel修改以了解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
这将正常工作,只要 libone 在 libtwo 之前导入,因为它们都会查找已经被 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
对于更复杂的示例和测试环境,您可以查看使用 consolidatewheels 的 https://github.com/amol-/wheeldeps。
项目详情
下载文件
下载适合您平台的项目文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。