以前咱們介紹過在 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 目錄下。
本文爲雲棲社區原創內容,未經容許不得轉載。