PyODPS制作第三方包
PyODPS自V0.11.3版本開始提供了pyodps-pack
命令行工具,用于制作符合PyODPS及DataWorks PyODPS節(jié)點(diǎn)標(biāo)準(zhǔn)的三方包,使用方法類似pip
命令。您可以使用該工具將所有依賴項(xiàng)目制作成一個后綴為.tar.gz
的壓縮包,其中包含所有依照MaxCompute或DataWorks環(huán)境編譯并打包的項(xiàng)目依賴。您也可以使用該工具打包您項(xiàng)目中自行創(chuàng)建的Python包。
環(huán)境準(zhǔn)備
pyodps-pack
命令需要在操作系統(tǒng)命令行(Windows CMD或者macOS/Linux Shell)中執(zhí)行,DataWorks、odpscmd和Python命令行中不能調(diào)用。
Docker模式
您需要安裝Docker以順利使用Docker模式運(yùn)行pyodps-pack
,pyodps-pack
會自動調(diào)用已安裝的Docker并下載鏡像,您無需手動執(zhí)行下載Docker鏡像和運(yùn)行Docker命令的操作。
僅支持在Docker模式下執(zhí)行pyodps-pack
命令,非Docker模式執(zhí)行會報錯。
Linux環(huán)境:可以參考Docker官方文檔安裝Docker。
macOS或Windows環(huán)境:
個人開發(fā)者:可以使用Docker Desktop。
未購買過授權(quán)的企業(yè)用戶:推薦使用開源的Rancher Desktop。
我們沒有在包括minikube
在內(nèi)的其他Docker環(huán)境中測試pyodps-pack
,不保證在這些環(huán)境中的可用性。
對于Windows用戶,可能您的Docker服務(wù)需要依賴Windows系統(tǒng)的Server服務(wù)才能啟動,而Server服務(wù)由于安全問題在很多企業(yè)被禁止啟動。在遇到問題時,請改用Linux打包或者設(shè)法啟用Server服務(wù)。Rancher Desktop在Windows 10下可能無法使用containerd
作為容器引擎,可以嘗試改用dockerd
,配置詳情請參考Container Engine。
無Docker模式
當(dāng)您的環(huán)境支持Docker時,推薦采用Docker模式進(jìn)行打包PyODPS所有依賴、代碼以及Git Repo中的代碼。若Docker不可用,才考慮使用非Docker模式。需要注意的是,非Docker模式生成的包可能不可用。
如果您安裝Docker遇到困難,可以嘗試使用非Docker模式。使用方式為新增一個--without-docker
參數(shù)。該模式需要您的Python環(huán)境中已經(jīng)安裝pip。如果在該模式下執(zhí)行pyodps-pack
命令出現(xiàn)錯誤或者生成的包不可用,請改用Docker模式。Windows用戶需要安裝Git Bash以使用該模式,Git Bash包含在Git for Windows中。
打包操作
使用限制
MaxCompute建議除非不得已,新項(xiàng)目請盡量使用Python 3。我們不保證下面打包步驟對Python 2的可用性。
舊項(xiàng)目請盡量遷移至Python 3以減少后續(xù)維護(hù)的難度。
在Linux中使用下列命令時,請使用
sudo
調(diào)用pyodps-pack
以保證Docker正常運(yùn)行。在macOS中使用下列命令時,請不要使用sudo調(diào)用pyodps-pack以避免可能引發(fā)的權(quán)限錯誤。
打包所有依賴
部分Python包可能存在一些可選依賴,例如pandas在使用to_excel方法時依賴openpyxl包,pyodps-pack
無法自動包含這部分依賴,請根據(jù)三方包文檔手動在打包命令中添加這些依賴。
安裝完P(guān)yODPS后,您可以在本地命令行中使用以下命令為Python 3打包pandas以及pandas的依賴項(xiàng)。
使用Docker模式打包:
pyodps-pack pandas
使用非Docker模式打包:
pyodps-pack --without-docker pandas
打包時指定所需版本:
pyodps-pack pandas==1.2.5
經(jīng)過一系列的打包步驟,工具會顯示包中的所有依賴版本,具體如下。并在當(dāng)前目錄中生成一個packages.tar.gz
文件,其中包括下面列出的所有依賴項(xiàng)目。
Package Version
--------------- -------
numpy 1.21.6
pandas 1.2.5
python-dateutil 2.8.2
pytz 2022.6
six 1.16.0
如果您希望為Python 2.7打包,請確定包的后續(xù)使用環(huán)境為MaxCompute還是DataWorks,辨別方法請參考PyODPS DataFrame的代碼運(yùn)行環(huán)境。
在MaxCompute中使用Python 2.7包的打包命令:
pyodps-pack --mcpy27 pandas
在DataWorks中使用Python 2.7包的打包命令:
pyodps-pack --dwpy27 pandas
打包自定義代碼
pyodps-pack
支持打包使用setup.py
或pyproject.toml
組織的用戶自定義Python Project。詳情請參考Build System Interface。
示例:以基于pyproject.toml
組織的項(xiàng)目為例,為您介紹如何使用pyodps-pack
打包。假定項(xiàng)目的目錄結(jié)構(gòu)如下:
test_package_root
├── test_package
│ ├── __init__.py
│ ├── mod1.py
│ └── subpackage
│ ├── __init__.py
│ └── mod2.py
└── pyproject.toml
其中pyproject.toml
內(nèi)容可能為:
[project]
name = "test_package"
description = "pyodps-pack example package"
version = "0.1.0"
dependencies = [
"pandas>=1.0.5"
]
完成包的開發(fā)后,使用以下命令可以將此包和所有依賴打包進(jìn)packages.tar.gz
文件中(path_to_package
為test_package_root
的上級路徑):
pyodps-pack /<path_to_package>/test_package_root
打包Git Repo中的代碼
pyodps-pack
支持打包遠(yuǎn)程Git代碼倉庫(例如GitHub)中的代碼。以PyODPS本身為例,可以使用以下命令執(zhí)行打包:
pyodps-pack git+https://github.com/aliyun/aliyun-odps-python-sdk.git
如果想要打包某個分支或者Tag,可以使用:
pyodps-pack git+https://github.com/aliyun/aliyun-odps-python-sdk.git@v0.11.2.2
如果打包前需要安裝一些打包依賴(例如cython
),可以使用--install-requires
參數(shù)增加安裝時依賴。也可以編寫一個格式與requirements.txt
相同的install-requires.txt
文件,并使用--install-requires-file
選項(xiàng)指定。例如,如果需要先安裝Cython
再打包PyODPS,可以執(zhí)行如下命令:
pyodps-pack \
--install-requires cython \
git+https://github.com/aliyun/aliyun-odps-python-sdk.git@v0.11.2.2
也可以創(chuàng)建一個install-requires.txt
文件并依照requirements.txt
格式編寫如下:
cython>0.29
打包命令可以寫成:
pyodps-pack \
--install-requires-file install-requires.txt \
git+https://github.com/aliyun/aliyun-odps-python-sdk.git@v0.11.2.2
更復(fù)雜的例子:二進(jìn)制依賴
一部分包包含額外的二進(jìn)制依賴,例如需要編譯或安裝的外部動態(tài)鏈接庫。pyodps-pack
提供了--run-before
參數(shù)用以指定打包前需要執(zhí)行的步驟,該步驟中可以安裝所需的二進(jìn)制依賴。下面以地理信息庫GDAL為例為您介紹如何打包。
確定打包時需要安裝的二進(jìn)制依賴。
根據(jù)GDAL 3.6.0在PyPI上的文檔,我們需要安裝3.6.0以上版本的libgdal。libgdal編譯說明則指出,該包依賴6.0版本以上的PROJ包,這兩個二進(jìn)制包均使用CMake打包。據(jù)此,編寫二進(jìn)制包安裝文件并保存為
install-gdal.sh
:#!/bin/bash set -e cd /tmp curl -o proj-6.3.2.tar.gz https://download.osgeo.org/proj/proj-6.3.2.tar.gz tar xzf proj-6.3.2.tar.gz cd proj-6.3.2 mkdir build && cd build cmake .. cmake --build . cmake --build . --target install cd /tmp curl -o gdal-3.6.0.tar.gz http://download.osgeo.org/gdal/3.6.0/gdal-3.6.0.tar.gz tar xzf gdal-3.6.0.tar.gz cd gdal-3.6.0 mkdir build && cd build cmake .. cmake --build . cmake --build . --target install
使用
pyodps-pack
進(jìn)行打包,命令如下:pyodps-pack --install-requires oldest-supported-numpy --run-before install-gdal.sh gdal==3.6.0
命令詳情
下面列出pyodps-pack
命令的可用參數(shù),可用于控制打包過程:
參數(shù)名稱 | 描述 |
| 根據(jù)給定的依賴文件打包。該選項(xiàng)可被指定多次。 |
| 指定打包生成目標(biāo)文件名,默認(rèn)為 |
| 指定打包時所需的PyPI依賴,可指定多個,一般用于命令行中。這些依賴不一定會包含在最終的包中。 |
| 指定打包時所需的PyPI依賴定義文件,可指定多個。這些依賴不一定會包含在最終的包中。 |
| 指定打包前需要執(zhí)行的Bash腳本,通常可用于安裝二進(jìn)制依賴。 |
| 指定打包時需要從最終包刪除的PyPI依賴。該選項(xiàng)可被指定多次。 |
| 指定打包時不包含指定項(xiàng)目的依賴項(xiàng)。 |
| 指定打包時所需的PyPI URL。如果缺省,會使用 |
| 指定打包時需要忽略證書問題的HTTPS域名。 |
| 指定后,將使用CentOS 5鏡像進(jìn)行打包,這使得包可以被用在舊版專有云等環(huán)境中。 |
| 指定后,將為MaxCompute內(nèi)的Python 2.7制作三方包。如果啟用,將默認(rèn) |
| 指定后將為DataWorks內(nèi)的Python 2.7制作三方包。如果啟用。將默認(rèn) |
| 指定后,將傾向于選擇PyPI中包含二進(jìn)制編譯的舊版,而不是僅有源碼包的新版。 |
| 指定在執(zhí)行Docker命令時需要額外附加的參數(shù)。如有多個參數(shù)需用引號包裹,例如 |
| 使用無Docker模式運(yùn)行 |
| 下載或生成Wheel包后不生成 |
| 指定后,將輸出命令運(yùn)行的詳細(xì)信息,用于排查問題。 |
第三方包的使用方法請參見PyODPS使用第三方包。