如何製作可以在 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 上打包的標準工具,如有進一步的問題可研究該項目。

  1. 準備依賴項

不少包都有依賴項,例如 devel rpm 包或者其他 Python 包,在打包前需要了解該包的依賴,通常可以在 Github 中找到安裝或者打包的相關信息。對於 crcmod,除 gcc 外不再有別的依賴,因而此步可略去。

  1. 修改 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 已可以使用。

  1. 準備打包腳本

在項目中新建 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
  1. 打包

使用 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 目錄下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章