全部產品
Search
文件中心

:PyODPS製作第三方包

更新時間:Jul 17, 2024

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-packpyodps-pack會自動調用已安裝的Docker並下載鏡像,您無需手動執行下載Docker鏡像和運行Docker命令的操作。

說明

僅支援在Docker模式下執行pyodps-pack命令,非Docker模式執行會報錯。

說明

我們沒有在包括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.pypyproject.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_packagetest_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為例為您介紹如何打包。

  1. 確定打包時需要安裝的二進位依賴。

    根據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
  2. 使用pyodps-pack進行打包,命令如下:

    pyodps-pack --install-requires oldest-supported-numpy --run-before install-gdal.sh gdal==3.6.0

命令詳情

下面列出pyodps-pack命令的可用參數,可用於控制打包過程:

參數名稱

描述

-r--requirement <file>

根據給定的依賴檔案打包。該選項可被指定多次。

-o--output <file>

指定打包產生目標檔案名,預設為packages.tar.gz

--install-requires <item>

指定打包時所需的PyPI依賴,可指定多個,一般用於命令列中。這些依賴不一定會包含在最終的包中。

--install-requires-file <file>

指定打包時所需的PyPI依賴定義檔案,可指定多個。這些依賴不一定會包含在最終的包中。

--run-before <script-file>

指定打包前需要執行的Bash指令碼,通常可用於安裝二進位依賴。

-x--exclude <dependency>

指定打包時需要從最終包刪除的PyPI依賴。該選項可被指定多次。

--no-deps

指定打包時不包含指定專案的依賴項。

-i--index-url <index-url>

指定打包時所需的PyPI URL。如果預設,會使用pip config list命令返回的global.index-url值,該值通常配置在pip.conf設定檔中。

--trusted-host <host>

指定打包時需要忽略認證問題的HTTPS網域名稱。

-l--legacy-image

指定後,將使用CentOS 5鏡像進行打包,這使得包可以被用在舊版專有雲等環境中。

--mcpy27

指定後,將為MaxCompute內的Python 2.7製作三方包。如果啟用,將預設--legacy-image選項開啟。

--dwpy27

指定後將為DataWorks內的Python 2.7製作三方包。如果啟用。將預設--legacy-image選項開啟。

--prefer-binary

指定後,將傾向於選擇PyPI中包含二進位編譯的舊版,而不是僅有源碼包的新版。

--docker-args <args>

指定在執行Docker命令時需要額外附加的參數。如有多個參數需用引號包裹,例如--docker-args "--ip 192.168.1.10"

--without-docker

使用無Docker模式運行pyodps-pack。當依賴中存在二進位依賴,可能報錯或導致包不可用。

--without-merge

下載或產生Wheel包後不產生.tar.gz包,而是保留.whl檔案。

--debug

指定後,將輸出命令啟動並執行詳細資料,用於排查問題。

第三方包的使用方法請參見PyODPS使用第三方包