PyODPS自V0.11.3版本开始提供了pyodps-pack
命令行工具,用于制作符合PyODPS及DataWorks PyODPS节点标准的三方包,使用方法类似pip
命令。您可以使用该工具将所有依赖项目制作成一个后缀为.tar.gz
的压缩包,其中包含所有依照MaxCompute或DataWorks环境编译并打包的项目依赖。您也可以使用该工具打包您项目中自行创建的Python包。
环境准备
pyodps-pack命令需要在操作系统命令行(Windows CMD或者macOS/Linux Shell)中执行,DataWorks和odpscmd中不能调用。
Docker模式
您需要安装Docker以顺利使用Docker模式运行pyodps-pack
,pyodps-pack
会自动调用已安装的Docker,您无需手动在Docker中运行pyodps-pack
。
-
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模式仅用于Docker不可用的场景,且生成的包有可能不可用。
如果您安装Docker遇到困难,可以尝试使用非Docker模式。使用方式为新增一个--without-docker
参数。该模式需要您的Python环境中已经安装pip。如果使用该模式出现错误,请改用Docker模式。Windows用户需要安装Git Bash以使用该模式,Git Bash包含在Git for Windows中。
打包操作
您可以使用pyodps-pack
命令在本地PyODPS环境中执行打包操作,其中包括打包所有依赖、打包自定义代码、打包Git Repo中的代码及打包二进制依赖。
说明
请勿在Docker环境中执行pyodps-pack
命令。
使用限制
-
MaxCompute建议除非不得已,新项目请尽量使用Python 3。我们不保证下面打包步骤对Python 2的可用性。
-
旧项目请尽量迁移至Python 3以减少后续维护的难度。
-
在Linux中使用下列命令时,请使用
sudo
调用pyodps-pack
以保证Docker正常运行。
打包所有依赖
安装完PyODPS后,您可以在本地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 //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使用第三方包。
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家
阿里云企业补贴进行中: 马上申请
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
转转请注明出处:https://www.yunxiaoer.com/159572.html