如何製作可以在 MaxCompute 上使用的 crcmod
之前我們介紹過在 PyODPS DataFrame 中使用三方包 。對於二進位制包而言,MaxCompute 要求使用包名包含 cp27-cp27m 的 Wheel 包。但對於部分長時間未更新的包,例如 oss2 依賴的 crcmod,PyPI 並未提供 Wheel 包,因而需要自行打包。本文介紹瞭如何使用 quay.io/pypa/manylinux1_x86_64 映象製作可在 MaxCompute 上使用的 Wheel 包。
本文參考https://github.com/pypa/manylinux ,quay.io/pypa/manylinux1_x86_64 映象也是目前絕大多數 Python 專案在 Travis CI 上打包的標準工具,如有進一步的問題可研究該專案。
- 準備依賴項
不少包都有依賴項,例如 devel rpm 包或者其他 Python 包,在打包前需要了解該包的依賴,通常可以在 Github 中找到安裝或者打包的相關資訊。對於 crcmod,除 gcc 外不再有別的依賴,因而此步可略去。
- 修改 setup.py 並驗證(建議在 Mac OS 或者 Linux 下)
較舊的 Python 包通常不支援製作 Wheel 包。具體表現為在使用python setup.py bdist_wheel
打包時報錯。如果需要製作 Wheel 包,需要修改 setup.py 以支援 Wheel 包的製作。對於一部分包,可以簡單地將 distutils 中的 setup 函式替換為 setuptools 中的 setup 函式。而對於部分自定義操作較多的 setup.py,需要詳細分析打包過程,這一項工作可能會很複雜,本文就不討論了。
例如,對於 crcmod,修改 setup.py 中的
from distutils.core import setup
為
from setuptools import setup
即可。
修改完成後,在專案根目錄執行
python setup.py bdist_wheel
如果沒有報錯且生成的 Wheel 包可在本地使用,說明 setup.py 已可以使用。
- 準備打包指令碼
在專案中新建 bin 目錄,並在其中建立 build-wheel.sh:
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 目錄下。