之前我們介紹過在 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 目錄下。