gpt4 book ai didi

python - 如何在本地机器上为 linux 发布二进制 Python 轮子

转载 作者:行者123 更新时间:2023-12-03 21:22:34 31 4
gpt4 key购买 nike

我有一个包含 C 扩展的包,我想上传到 pypi:https://github.com/Erotemic/netharn

我使用命令 python setup.py bdist_wheel --py-limited-api=cp36 在 Ubuntu 18.04 上构建了一个轮子,但是当我用twine upload --skip-existing dist/*去上传的时候,但后来我收到错误,说它有一个不受支持的平台标签:

HTTPError: 400 Client Error: Binary wheel 'netharn-0.0.4-cp36-abi3-linux_x86_64.whl' has an unsupported platform tag 'linux_x86_64'. for url: https://upload.pypi.org/legacy/

经过一番搜索,我发现 PEP 513 需要构建一个轮子来支持 manylinux(又名 Centos5): https://github.com/pypa/manylinux

他们在这里提供了一个例子: https://github.com/pypa/python-manylinux-demo/blob/master/travis/build-wheels.sh

但是,我能找到的所有示例总是使用某种 CI 服务器构建它们的二进制文件。如果可能,我希望能够在本地构建它们。我认为只需复制 docker 命令并将其构建在我自己机器上的 docker 容器中应该很简单。但是,我遇到了问题。 (我确保删除了 repo 中任何现有的 build 和 dist 目录)

我做的第一件事就是让自己沉浸在交互式 docker session 中,这样我就可以玩一些东西了。我选择了 x8_64 镜像并将本地目录挂载到我的代码存储库 /io在码头机器中。然后我开始了一个交互式 bash session 。
REPO_DPATH=$HOME/code/netharn
DOCKER_IMAGE=quay.io/pypa/manylinux1_x86_64
PRE_CMD=""
# Interactive test
docker run -it --rm -v $REPO_DPATH:/io $DOCKER_IMAGE $PRE_CMD bash

在 docker 中,我首先想为 python36 构建一个轮子(实际上这是我目前唯一有兴趣支持的 Python)。
PYBIN=/opt/python/cp36-cp36m/bin/

简单地安装我的requirements.txt似乎不起作用,所以我先手动安装了几个包。这样做之后( imgaug 是罪魁祸首,因为它依赖于特定的主版本),安装 requirements.txt 似乎工作。
    cd /io
"${PYBIN}/pip" install opencv_python
"${PYBIN}/pip" install Cython
"${PYBIN}/pip" install pytest
"${PYBIN}/pip" install -e git+https://github.com/aleju/imgaug.git@master#egg=imgaug
"${PYBIN}/pip" install torch # this is in the requirements.txt, but will cause problems later
"${PYBIN}/pip" install -r requirements.txt

然后我运行wheel命令并将外部共享库捆绑到轮子中
"${PYBIN}/pip" wheel /io/ -w wheelhouse/
for whl in wheelhouse/*.whl; do
auditwheel repair "$whl" -w /io/wheelhouse/
done

最后一步是安装包并测试
    "${PYBIN}/pip" install netharn --no-index -f /io/wheelhouse

(cd "$HOME"; "${PYBIN}/python" -m xdoctest netharn all)

但是,当我要测试它时,我得到了
ImportError: /opt/python/cp36-cp36m/lib/python3.6/site-packages/torch/_C.cpython-36m-x86_64-linux-gnu.so: ELF file OS ABI invalid

我猜这是因为 torch不支持 Centos5。
我不明白的是如何 torch上传 cpython-36m-x86_64-linux-gnu.so共享库到 pypi,但我遇到了问题?

最佳答案

有效的解决方案 警告说明如下 .

pip install auditwheel twine
apt install patchelf
python setup.py bdist_wheel
auditwheel repair [[lib]]-linux_x86_64.whl -w . --plat manylinux_2_24_x86_64
twine upload [[lib]]-manylinux_2_24_x86_64.whl
语境
我有一个带有 python 包装器的 C 库,我不直接拥有(使 CI 变得困难),用户群非常小(不需要真正的 manylinux 支持)和一个不包含包装器的官方 conda 二进制文件(不要t 想建立一个竞争性的 conda channel )。
以上解决了我在 Ubuntu 20.04 上的特定需求,但请在使用前阅读以下内容。
注意事项
  • 如果你可以控制你的仓库,你真的应该使用 CI。如果已设置,则无需命令行上传。
  • 这不支持较旧的/更广泛的 manylinux_1发行版为 Ubuntu 20.04 is too new for it .这应该仍然支持大部分 Linux 发行版,但可能无法在旧硬件(例如大学 HPC 集群)上运行。
  • 直接从 docker 容器构建可能会更好。构建 + 修复工作流程很丑陋。我猜这只不过是带有一些 .so 清理的文件重命名。
  • 关于python - 如何在本地机器上为 linux 发布二进制 Python 轮子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50690526/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com