如何在本地计算机上发布Linux的二进制Python轮

时间:2018-06-05 00:38:55

标签: python pypi python-wheel

我有一个包含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容器中构建它应该很简单。但是,我遇到了问题。 (我确保删除了回购中的任何现有build和dist目录)

我做的第一件事就是把自己转移到一个交互式的docker会话中,这样我就能玩弄东西了。我选择了x8_64映像并将本地目录挂载到docker机器/io上的代码存储库中。然后我开始了一个交互式的bash会话。

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。 我没有得到的是torchcpython-36m-x86_64-linux-gnu.so共享库上传到pypi的方式,但我遇到了问题?

1 个答案:

答案 0 :(得分:0)

适用于注意事项如下的解决方案

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 二进制文件(不想制作竞争性的 conda 频道)。

以上解决了我在 Ubuntu 20.04 上的特定需求,但请在使用前阅读以下内容。

注意事项

  • 如果您可以控制自己的存储库,那么您确实应该使用 CI。如果已设置,则无需命令行上传。
  • 这不支持较旧/更广泛的 manylinux_1 发行版,如 Ubuntu 20.04 is too new for it。这应该仍然支持大部分 Linux 发行版,但可能无法在旧硬件(例如大学 HPC 集群)上运行。
  • 直接从 docker 容器构建可能会更好。构建 + 修复工作流程很丑陋。我猜这只不过是用一些 .so 清理文件重命名。