3

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

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

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

4

1 回答 1

3

有一种方法,但它有点违背了审计轮修复的目的。

您需要将 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 解释器调用此脚本,否则它将失败。如果需要,您可以通过这种方式修复 Python 2.7 轮子。diplib 项目还展示了一个需要在 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

# ...
于 2021-10-11T06:28:21.383 回答