我可以从 auditwheel 修复中排除库吗?

Can I exclude libraries from auditwheel repair?

我正在使用 manylinux2014_x86_64 为 python 库构建一些预编译的 linux 轮子,该库充当涉及 CUDA 的 C++ 库的 API。我用 pip wheel 创建轮子,然后 运行 auditwheel repair 在轮子中包含外部库(我的 c++ 库、pybind11 等)

问题是它想把CUDA 运行时间和驱动库打包到轮子里。理想情况下,我想将 CUDA 安装留给用户,而不是必须将其包含在 python 轮中(我什至不确定它的可再分发性)。

是否有人知道将来自 auditwheel repair 的 cuda 库列入黑名单的方法?或者另一种更好的方法?

有办法,但有点违背了审计轮修复的目的。

您需要将 auditwheel 安装为 Python 模块,然后将其导入到您自己的 python 脚本中并猴子修补一些指定修复策略的值。

# Monkey patch to not ship libjvm.so in pypi wheels
import sys

from auditwheel.main import main
from auditwheel.policy import _POLICIES as POLICIES

# libjvm is loaded dynamically; do not include it
for p in POLICIES:
    p['lib_whitelist'].append('libjvm.so')

if __name__ == "__main__":
    sys.exit(main())

此代码段来自 diplib 项目,它可以满足您对 Java 库的需求。您需要修改此脚本以涵盖您需要列入白名单的库。

此脚本需要由 Python 3.x 解释器调用,否则将失败。您可以 repair Python 2.7 wheels this way just fine if you need to. The diplib project also shows an example invocation 需要在 manylinux docker 容器中发生。

#!/bin/bash
# Run this in a manylinux2010 docker container with /io mounted to some local directory

# ...

/opt/python/cp37-cp37m/bin/python -m pip install cmake auditwheel  # ignore "cmake"

# ...

export AUDITWHEEL=`pwd`/diplib/tools/travis/auditwheel  # the monkey patch script

# ...

/opt/python/cp37-cp37m/bin/python $AUDITWHEEL repair pydip/staging/dist/*.whl

# ...