A ferramenta de linha de comando (CLI) pyodps-pack está disponível a partir do PyODPS V0.11.3. Ela empacota dependências Python — pacotes do PyPI, código personalizado, repositórios git e pacotes com dependências binárias — em um arquivo .tar.gz. Nós do MaxCompute e do DataWorks que utilizam PyODPS podem consumir esse arquivo diretamente. O funcionamento é semelhante ao uso do pip.
Pré-requisitos
Antes de começar, verifique se você possui:
PyODPS V0.11.3 ou versão posterior instalada
Docker instalado e em execução (necessário para o modo Docker, que é o padrão)
Python 3 (recomendado; o empacotamento com Python 2 pode falhar em projetos novos)
Visão geral dos cenários de empacotamento
Consulte esta tabela para identificar o comando adequado ao seu cenário e siga as instruções detalhadas nas seções abaixo.
|
Cenário |
Comando |
|
Empacotar um pacote do PyPI (modo Docker) |
|
|
Empacotar um pacote do PyPI (modo sem Docker) |
|
|
Empacotar uma versão específica |
|
|
Empacotar para Python 2.7 no MaxCompute |
|
|
Empacotar para Python 2.7 no DataWorks |
|
|
Empacotar código local personalizado |
|
|
Empacotar a partir de um repositório git |
|
|
Empacotar com dependências binárias |
|
Como funciona
O pyodps-pack é instalado automaticamente junto com o PyODPS. Em sistemas Linux e macOS, o executável fica no diretório bin, dentro do caminho de instalação do Python. No Windows, ele está localizado no diretório Scripts. Execute os comandos do pyodps-pack na CLI do Windows, no Terminal do macOS ou no Shell do Linux. Não os execute no console do DataWorks, no cliente do MaxCompute (odpscmd) nem na CLI do Python.
Se o diretório bin ou Scripts já estiver na variável de ambiente PATH (definida durante a instalação do Python ou ativação do ambiente virtual), nenhuma configuração adicional será necessária. Caso contrário, navegue manualmente até o diretório ou adicione-o à variável PATH.
Após a conclusão do empacotamento, o pyodps-pack exibe todas as versões das dependências resolvidas e grava o arquivo packages.tar.gz no diretório atual.
Escolher um modo de empacotamento
O pyodps-pack oferece suporte a dois modos:
|
Modo |
Quando usar |
Como ativar |
|
Modo Docker (padrão) |
Sempre que o Docker estiver disponível. Gera os pacotes com maior compatibilidade. |
Instale o Docker; nenhum sinalizador extra é necessário |
|
Modo sem Docker |
Apenas quando o Docker não estiver disponível no seu ambiente |
Adicione |
Pacotes criados no modo sem Docker podem não funcionar no MaxCompute ou no DataWorks. Utilize o modo Docker sempre que possível.
Configurar o Docker
O pyodps-pack invoca o Docker automaticamente e baixa as imagens necessárias, eliminando a necessidade de gerenciar imagens manualmente.
Linux: Consulte Install Docker Engine.
macOS ou Windows:
Desenvolvedores individuais: use o Docker Desktop.
Usuários corporativos impossibilitados de usar o Docker Desktop: use o Rancher Desktop (código aberto).
O pyodps-pack não foi testado em outros ambientes Docker, como o minikube. A disponibilidade nesses ambientes não é garantida.
Observações específicas para Windows:
O serviço do Docker pode exigir o Windows Server para iniciar, mas muitas organizações desativam o Windows Server por motivos de segurança. Se o Docker não conseguir iniciar, mude para Linux ou tente ativar o Windows Server.
No Windows 10 com Rancher Desktop, o
containerdpode não funcionar como mecanismo de contêiner. Use odockerdem seu lugar. Consulte Container Engine para obter as etapas de configuração.
Configurar o modo sem Docker
Utilize o modo sem Docker apenas quando o Docker não estiver disponível. Se ocorrerem erros ou se o pacote gerado não funcionar, mude para o modo Docker.
Adicione --without-docker a qualquer comando do pyodps-pack. Antes de usar este modo:
Certifique-se de que o
pipesteja instalado no seu ambiente Python.No Windows, instale o Git Bash (incluído no Git for Windows).
Empacotar dependências do PyPI
Alguns pacotes possuem dependências opcionais que o pyodps-pack não inclui automaticamente. Por exemplo, o pandas exige o openpyxl ao utilizar o método to_excel. Verifique a documentação do pacote de terceiros e adicione explicitamente quaisquer dependências opcionais ao comando.
Observações de uso:
Utilize Python 3 para novos projetos do MaxCompute. O empacotamento com Python 2 pode falhar.
Migre projetos existentes em Python 2 para Python 3 a fim de simplificar a manutenção.
No Linux, prefixe os comandos do
pyodps-packcomsudopara garantir que o Docker tenha as permissões necessárias.No macOS, não utilize
sudocom opyodps-pack, pois isso pode causar erros de permissão.
Modo Docker:
pyodps-pack pandas
Modo sem Docker:
pyodps-pack --without-docker pandas
Versão específica:
pyodps-pack pandas==1.2.5
Após o empacotamento, o pyodps-pack exibe as versões resolvidas de todos os pacotes incluídos:
Package Version
--------------- -------
numpy 1.21.6
pandas 1.2.5
python-dateutil 2.8.2
pytz 2022.6
six 1.16.0
O arquivo de saída packages.tar.gz é gravado no diretório atual.
Empacotar para Python 2.7
Caso precise de um pacote para Python 2.7, o comando varia conforme o local de execução do pacote. Consulte PyODPS DataFrame para mais contexto.
Para o MaxCompute:
pyodps-pack --mcpy27 pandas
Para o DataWorks:
pyodps-pack --dwpy27 pandas
Empacotar código personalizado
O pyodps-pack empacota projetos Python personalizados construídos com setup.py ou pyproject.toml. Consulte Build System Interface para obter detalhes.
O exemplo a seguir empacota um projeto baseado em pyproject.toml com esta estrutura de diretórios:
test_package_root
├── test_package
│ ├── __init__.py
│ ├── mod1.py
│ └── subpackage
│ ├── __init__.py
│ └── mod2.py
└── pyproject.toml
Exemplo de pyproject.toml:
[project]
name = "test_package"
description = "pyodps-pack example package"
version = "0.1.0"
dependencies = [
"pandas>=1.0.5"
]
Execute o comando abaixo, substituindo <path_to_package> pelo diretório pai de test_package_root:
pyodps-pack /<path_to_package>/test_package_root
Esse processo compacta o projeto e todas as suas dependências no arquivo packages.tar.gz.
Empacotar código de um repositório git
Informe a URL do git diretamente:
pyodps-pack git+https://github.com/aliyun/aliyun-odps-python-sdk.git
Para empacotar uma branch ou tag específica:
pyodps-pack git+https://github.com/aliyun/aliyun-odps-python-sdk.git@v0.11.2.2
Se o processo de empacotamento exigir dependências de compilação (como Cython), especifique-as com --install-requires. Essas dependências são utilizadas durante o empacotamento, mas não são necessariamente incluídas no arquivo de saída.
pyodps-pack \
--install-requires cython \
git+https://github.com/aliyun/aliyun-odps-python-sdk.git@v0.11.2.2
Alternativamente, liste as dependências de compilação em um arquivo que siga o formato requirements.txt e passe-o com --install-requires-file:
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
Empacotar dependências binárias
Alguns pacotes incluem componentes binários — como bibliotecas de vínculo dinâmico — que precisam ser compilados antes do empacotamento. Utilize --run-before para executar um script Bash que instale esses componentes binários antes da execução do pyodps-pack.
O exemplo a seguir empacota o GDAL 3.6.0, que requer libgdal (versão > 3.6.0) e PROJ (versão 6.0 ou posterior), ambos compilados com CMake.
-
Crie um script chamado
install-gdal.shque compile e instale o PROJ e o GDAL:#!/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 -
Execute o
pyodps-packcom o script e a dependência de compilaçãooldest-supported-numpy:pyodps-pack --install-requires oldest-supported-numpy --run-before install-gdal.sh gdal==3.6.0
Parâmetros
|
Parâmetro |
Descrição |
|
|
Arquivo de dependências necessário para o empacotamento. Pode ser especificado várias vezes. |
|
|
Nome do arquivo de saída. Padrão: |
|
|
Dependência do PyPI necessária no momento do empacotamento (não necessariamente incluída no arquivo de saída). Pode ser especificada várias vezes. |
|
|
Arquivo que lista dependências do PyPI necessárias no momento do empacotamento, no formato |
|
|
Script Bash a ser executado antes do empacotamento. Geralmente usado para instalar dependências binárias. |
|
|
Dependência do PyPI a ser excluída do arquivo de saída. Pode ser especificada várias vezes. |
|
|
Exclui dependências transitivas do arquivo de saída. |
|
|
URL do índice PyPI. O padrão é |
|
|
Host HTTPS cujos erros de certificado devem ser ignorados durante o empacotamento. |
|
|
Usa uma imagem CentOS 5 para empacotamento. Garante compatibilidade com ambientes mais antigos, como versões anteriores do Apsara Stack. |
|
|
Gera um pacote para Python 2.7 no MaxCompute. Ativa |
|
|
Gera um pacote para Python 2.7 no DataWorks. Ativa |
|
|
Prefere distribuições binárias mais antigas no PyPI em vez de distribuições mais recentes apenas com código-fonte. |
|
|
Argumentos adicionais a serem passados para o Docker. Coloque vários argumentos entre aspas duplas, por exemplo: |
|
|
Executa o |
|
|
Mantém os arquivos |
|
|
Exibe detalhes da execução do comando para solução de problemas. |
Solucionar falhas de empacotamento
|
Sintoma |
Causa provável |
Resolução |
|
Pacote gerado no modo sem Docker não funciona no MaxCompute ou DataWorks |
O modo sem Docker não possui o ambiente de SO correspondente |
Mude para o modo Docker: remova |
|
Falha ao iniciar o Docker no Windows |
O Windows Server está desativado pela sua organização |
Mude para Linux ou tente ativar o Windows Server |
|
Erro de |
Mecanismo de contêiner incompatível |
Alterne para |
|
Falha no empacotamento com Python 2 |
O empacotamento com Python 2 pode falhar para pacotes mais recentes |
Use Python 3; se Python 2.7 for obrigatório, utilize |
|
Dependência opcional ausente em tempo de execução |
O |
Adicione a dependência opcional explicitamente ao comando, por exemplo: |
|
Falha na compilação de dependência binária |
Bibliotecas de sistema ou ferramentas de compilação ausentes |
Use |
Próximos passos
Após gerar o pacote, faça upload dele no MaxCompute como um recurso de arquivo e referencie-o no seu nó PyODPS. Consulte Referenciar um pacote de terceiros em um nó PyODPS.