以前咱们介绍过在 PyODPS DataFrame 中使用三方包。对于二进制包而言,MaxCompute 要求使用包名包含 cp27-cp27m 的 Wheel 包。但对于部分长时间未更新的包,例如 oss2 依赖的 crcmod,PyPI 并未提供 Wheel 包,于是须要自行打包。本文介绍了如何使用 quay.io/pypa/manylinux1_x86_64 镜像制做可在 MaxCompute 上使用的 Wheel 包。python
本文参考 https://github.com/pypa/manylinux ,quay.io/pypa/manylinux1_x86_64 镜像也是目前绝大多数 Python 项目在 Travis CI 上打包的标准工具,若有进一步的问题可研究该项目。linux
很多包都有依赖项,例如 devel rpm 包或者其余 Python 包,在打包前须要了解该包的依赖,一般能够在 Github 中找到安装或者打包的相关信息。对于 crcmod,除 gcc 外再也不有别的依赖,于是此步可略去。git
较旧的 Python 包一般不支持制做 Wheel 包。具体表现为在使用 python setup.py bdist_wheel
打包时报错。若是须要制做 Wheel 包,须要修改 setup.py 以支持 Wheel 包的制做。对于一部分包,能够简单地将 distutils 中的 setup 函数替换为 setuptools 中的 setup 函数。而对于部分自定义操做较多的 setup.py,须要详细分析打包过程,这一项工做可能会很复杂,本文就不讨论了。github
例如,对于 crcmod,修改 setup.py 中的docker
from distutils.core import setup
为vim
from setuptools import setup
便可。bash
修改完成后,在项目根目录执行函数
python setup.py bdist_wheel
若是没有报错且生成的 Wheel 包可在本地使用,说明 setup.py 已可使用。工具
在项目中新建 bin 目录,并在其中建立 build-wheel.sh:ui
mkdir bin && vim bin/build-wheel.sh
在其中填入如下内容:
#!/bin/bash # modified from https://github.com/pypa/python-manylinux-demo/blob/master/travis/build-wheels.sh set -e -x # Install a system package required by our library # 将这里修改成安装依赖项的命令 # Compile wheels PYBIN=/opt/python/cp27-cp27m/bin # 若是包根目录下有 dev-requirements.txt,取消下面的注释 # "${PYBIN}/pip" install -r /io/dev-requirements.txt "${PYBIN}/pip" wheel /io/ -w wheelhouse/ # Bundle external shared libraries into the wheels for whl in wheelhouse/*.whl; do auditwheel repair "$whl" -w /io/wheelhouse/ done
将第一步获知的依赖项安装脚本填入此脚本,在使用 python 或 pip 时,注意使用 /opt/python/cp27-cp27m/bin 中的版本。
最后,设置执行权限
chmod a+x bin/build-wheel.sh
使用 Docker 下载所需的镜像(本步须要使用 Docker,请提早安装),此后在项目根目录下打包:
docker pull quay.io/pypa/manylinux1_x86_64 docker run --rm -v `pwd`:/io quay.io/pypa/manylinux1_x86_64 /io/bin/build-wheel.sh
完成的 Wheel 包位于项目根目录下的 wheelhouse 目录下。
本文为云栖社区原创内容,未经容许不得转载。