PyODPS自V0.11.3版本開始提供了pyodps-pack
命令列工具,用於製作符合PyODPS及DataWorks PyODPS節點標準的三方包,使用方法類似pip
命令。您可以使用該工具將所有依賴專案製作成一個尾碼為.tar.gz
的壓縮包,其中包含所有依照MaxCompute或DataWorks環境編譯並打包的專案依賴。您也可以使用該工具打包您專案中自行建立的Python包。
環境準備
pyodps-pack
命令需要在作業系統命令列(Windows CMD或者macOS/Linux Shell)中執行,DataWorks、odpscmd和Python命令列中不能調用。
Docker模式
您需要安裝Docker以順利使用Docker模式運行pyodps-pack
,pyodps-pack
會自動調用已安裝的Docker並下載鏡像,您無需手動執行下載Docker鏡像和運行Docker命令的操作。
僅支援在Docker模式下執行pyodps-pack
命令,非Docker模式執行會報錯。
Linux環境:可以參考Docker官方文檔安裝Docker。
macOS或Windows環境:
個人開發人員:可以使用Docker Desktop。
未購買過授權的企業使用者:推薦使用開源的Rancher Desktop。
我們沒有在包括minikube
在內的其他Docker環境中測試pyodps-pack
,不保證在這些環境中的可用性。
對於Windows使用者,可能您的Docker服務需要依賴Windows系統的Server服務才能啟動,而Server服務由於安全問題在很多企業被禁止啟動。在遇到問題時,請改用Linux打包或者設法啟用Server服務。Rancher Desktop在Windows 10下可能無法使用containerd
作為容器引擎,可以嘗試改用dockerd
,配置詳情請參考Container Engine。
無Docker模式
當您的環境支援Docker時,推薦採用Docker模式進行打包PyODPS所有依賴、代碼以及Git Repo中的代碼。若Docker不可用,才考慮使用非Docker模式。需要注意的是,非Docker模式產生的包可能不可用。
如果您安裝Docker遇到困難,可以嘗試使用非Docker模式。使用方式為新增一個--without-docker
參數。該模式需要您的Python環境中已經安裝pip。如果在該模式下執行pyodps-pack
命令出現錯誤或者產生的包不可用,請改用Docker模式。Windows使用者需要安裝Git Bash以使用該模式,Git Bash包含在Git for Windows中。
打包操作
使用限制
MaxCompute建議除非不得已,新專案請盡量使用Python 3。我們不保證下面打包步驟對Python 2的可用性。
舊專案請盡量遷移至Python 3以減少後續維護的難度。
在Linux中使用下列命令時,請使用
sudo
調用pyodps-pack
以保證Docker正常運行。在macOS中使用下列命令時,請不要使用sudo調用pyodps-pack以避免可能引發的許可權錯誤。
打包所有依賴
部分Python包可能存在一些可選依賴,例如pandas在使用to_excel方法時依賴openpyxl包,pyodps-pack
無法自動包含這部分依賴,請根據三方包文檔手動在打包命令中添加這些依賴。
安裝完PyODPS後,您可以在本地命令列中使用以下命令為Python 3打包pandas以及pandas的依賴項。
使用Docker模式打包:
pyodps-pack pandas
使用非Docker模式打包:
pyodps-pack --without-docker pandas
打包時指定所需版本:
pyodps-pack pandas==1.2.5
經過一系列的打包步驟,工具會顯示包中的所有依賴版本,具體如下。並在目前的目錄中產生一個packages.tar.gz
檔案,其中包括下面列出的所有依賴專案。
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打包,請確定包的後續使用環境為MaxCompute還是DataWorks,辨別方法請參考PyODPS DataFrame的代碼運行環境。
在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
組織的專案為例,為您介紹如何使用pyodps-pack
打包。假定專案的目錄結構如下:
test_package_root
├── test_package
│ ├── __init__.py
│ ├── mod1.py
│ └── subpackage
│ ├── __init__.py
│ └── mod2.py
└── pyproject.toml
其中pyproject.toml
內容可能為:
[project]
name = "test_package"
description = "pyodps-pack example package"
version = "0.1.0"
dependencies = [
"pandas>=1.0.5"
]
完成包的開發後,使用以下命令可以將此包和所有依賴打包進packages.tar.gz
檔案中(path_to_package
為test_package_root
的上級路徑):
pyodps-pack /<path_to_package>/test_package_root
打包Git Repo中的代碼
pyodps-pack
支援打包遠程Git代碼倉庫(例如GitHub)中的代碼。以PyODPS本身為例,可以使用以下命令執行打包:
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
參數增加安裝時依賴。也可以編寫一個格式與requirements.txt
相同的install-requires.txt
檔案,並使用--install-requires-file
選項指定。例如,如果需要先安裝Cython
再打包PyODPS,可以執行如下命令:
pyodps-pack \
--install-requires cython \
git+https://github.com/aliyun/aliyun-odps-python-sdk.git@v0.11.2.2
也可以建立一個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
更複雜的例子:二進位依賴
一部分包包含額外的二進位依賴,例如需要編譯或安裝的外部動態連結程式庫。pyodps-pack
提供了--run-before
參數用以指定打包前需要執行的步驟,該步驟中可以安裝所需的二進位依賴。下面以地理資訊庫GDAL為例為您介紹如何打包。
確定打包時需要安裝的二進位依賴。
根據GDAL 3.6.0在PyPI上的文檔,我們需要安裝3.6.0以上版本的libgdal。libgdal編譯說明則指出,該包依賴6.0版本以上的PROJ包,這兩個二進位包均使用CMake打包。據此,編寫二進位包安裝檔案並儲存為
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
進行打包,命令如下:pyodps-pack --install-requires oldest-supported-numpy --run-before install-gdal.sh gdal==3.6.0
命令詳情
下面列出pyodps-pack
命令的可用參數,可用於控制打包過程:
參數名稱 | 描述 |
| 根據給定的依賴檔案打包。該選項可被指定多次。 |
| 指定打包產生目標檔案名,預設為 |
| 指定打包時所需的PyPI依賴,可指定多個,一般用於命令列中。這些依賴不一定會包含在最終的包中。 |
| 指定打包時所需的PyPI依賴定義檔案,可指定多個。這些依賴不一定會包含在最終的包中。 |
| 指定打包前需要執行的Bash指令碼,通常可用於安裝二進位依賴。 |
| 指定打包時需要從最終包刪除的PyPI依賴。該選項可被指定多次。 |
| 指定打包時不包含指定專案的依賴項。 |
| 指定打包時所需的PyPI URL。如果預設,會使用 |
| 指定打包時需要忽略認證問題的HTTPS網域名稱。 |
| 指定後,將使用CentOS 5鏡像進行打包,這使得包可以被用在舊版專有雲等環境中。 |
| 指定後,將為MaxCompute內的Python 2.7製作三方包。如果啟用,將預設 |
| 指定後將為DataWorks內的Python 2.7製作三方包。如果啟用。將預設 |
| 指定後,將傾向於選擇PyPI中包含二進位編譯的舊版,而不是僅有源碼包的新版。 |
| 指定在執行Docker命令時需要額外附加的參數。如有多個參數需用引號包裹,例如 |
| 使用無Docker模式運行 |
| 下載或產生Wheel包後不產生 |
| 指定後,將輸出命令啟動並執行詳細資料,用於排查問題。 |
第三方包的使用方法請參見PyODPS使用第三方包。