Rye: uma experiência Python sem complicações
(rye.astral.sh)- Rye é uma ferramenta de gerenciamento de projetos e pacotes que buscava lidar, em um só lugar, com a instalação do Python, projetos
pyproject.toml, dependências, virtualenv e instalação de ferramentas globais - Atualmente, seu desenvolvimento foi descontinuado, e recomenda-se usar o projeto sucessor uv, criado pelos mesmos mantenedores
- Usuários existentes podem migrar consultando o guia de migração para uv; o Rye continuará disponível para download, mas não há planos para novas atualizações
- A interrupção das atualizações também inclui atualizações de segurança, portanto, em novos projetos ou ambientes de manutenção de longo prazo, deve-se considerar a migração para o uv
- A experiência Python integrada que o Rye pretendia oferecer abrangia desde projetos complexos até monorepos, mas o foco de manutenção foi transferido para o uv
Estado atual do Rye
-
Desenvolvimento descontinuado e recomendação do uv
- Recomenda-se que todos os usuários usem o uv
- O uv é um projeto sucessor criado pelos mesmos mantenedores
- O uv é mantido ativamente e é muito mais usado do que o Rye
- Usuários atuais do Rye podem consultar o guia de migração para uv
- O Rye ainda pode ser usado, mas não há planos para atualizações adicionais
- Atualizações de segurança também não estão planejadas
Funcionalidades que o Rye oferecia
- O Rye é uma solução de gerenciamento de projetos e pacotes para Python
- Foi criado com o objetivo de ser uma ferramenta completa para usuários de Python
- Dentro de uma experiência integrada, ele cobre as seguintes tarefas
- Gerenciamento da instalação do Python
- Gerenciamento de projetos baseados em
pyproject.toml - Gerenciamento de dependências
- Gerenciamento de virtualenv
- Instalação de ferramentas globais
- Foi projetado para lidar com projetos complexos e monorepos
- O vídeo de apresentação pode ser visto em Watch an introduction
2 comentários
Já faz um tempo, mas depois de usar isto e aquilo,
estou usando o
Introduction - PDM.
Acho que vou precisar experimentar o Rye também.
Opiniões no Hacker News
Uma parte significativa do desenvolvimento principal de empacotamento agora está acontecendo no uv e, como o Rye usa o uv internamente, quando o uv melhora, o Rye melhora junto
Por exemplo, recentemente foi adicionada ao uv a resolução universal de dependências, permitindo criar um
requirements.txttravado com um único resultado de resolução que funciona em todas as plataformas e sistemas operacionais, não apenas no sistema em execução no momento; a versão mais recente do Rye também dá suporte a issohttps://github.com/astral-sh/uv
Como estou desenvolvendo o Rye e o uv, posso responder se houver perguntas
https://github.com/python-poetry/poetry/issues/6409
https://news.ycombinator.com/item?id=39257501
Esse é um dos motivos pelos quais a equipe da qual faço parte hesita em migrar. Como fazemos trabalho de ML, tomando como exemplo um projeto baseado em PyTorch, o estado desejado seria colocar todas as dependências no
pyproject.tomle, em um Mac AArch64 ou em uma workstation Windows AMD64, gerar arquivos de lock para as seguintes configurações de plataforma: Mac usando o PyTorch MPS padrão, Windows usando PyTorch CUDA, Linux AArch64 usando PyTorch CPU, Linux AMD64 usando PyTorch CPU, Linux AMD64 usando PyTorch CUDAObrigado por criar o Ruff; estou muito satisfeito tanto com o linting quanto com a formatação
pyenv+venv+pipsempre era doloroso; agora migrei para o RyeHoje é só instalar o Rye, baixar do GitHub e digitar
rye sync, e prontohttps://guac.sh/
https://pypi.org/project/sbom4python/ https://github.com/CycloneDX/cyclonedx-python
Graças ao recurso recém-adicionado de desfazer o pinning de dependências, dá para incentivar a manutenção da compatibilidade durante o desenvolvimento e gerar um
requirements.txtexato e explícito para reprodutibilidade, o que torna as etapas de gestão de vulnerabilidades e SBOM muito mais fáceis do que com ferramentas como o PoetryPor motivos parecidos, estou usando https://hatch.pypa.io/latest/why/, e também gosto do fato de ele combinar bem com o
uvO ponto que me deixava receoso em relação ao Rye era ele recomendar fortemente o uso de builds não padrão do Python
A página de filosofia (https://rye.astral.sh/philosophy/) explica que os builds do CPython do python.org são totalmente inadequados, que dependendo da plataforma há apenas instaladores
.msiou apenas tarballs, e que várias distribuições do Python divergem muito, criando todo tipo de problema para o subecossistema. Por isso, o projeto usa os builds standalone do indygreg e diz esperar que, algum dia, surja um build de Python bem mantido e confiável para substituir a confusão atualAs informações sobre esses builds do indygreg estão em https://gregoryszorc.com/docs/python-build-standalone/main/, e também é possível escolher outro Python: https://rye.astral.sh/guide/toolchains/
Dito isso, eu quase nunca passei pelos problemas que eles mencionam. O build oficial do Python baixado do python.org funcionou, o Python comum instalado pelo gerenciador de pacotes da distribuição funcionou, e o Python incluído nas imagens oficiais de contêiner Docker também funcionou
Esses builds especiais provavelmente também funcionam bem, mas a falta de padronização me deixa hesitante. Há até uma lista de peculiaridades de comportamento, e não entendo por que adicionar peculiaridades a algo que não está com problema. O fato de a filosofia do Rye ser tão entusiasmada em usar esse build também o torna menos atraente em comparação com alternativas que usam por padrão o Python já presente no sistema operacional
Para compilar o Python a partir do código-fonte, são necessárias novas dependências de sistema e muito tempo, e no fim aparece outro erro ainda mais obscuro sobre um arquivo de cabeçalho ausente. Ao pesquisar esse erro, surge uma flag de
./configureque contorna um problema corrigido pelo GCC upstream em 2017 e, de algum modo, você consegue concluirSe você nunca passou por esses três erros nem por um ambiente de build manylinux, evitou por completo um mundo de sofrimento. O mesmo vale para scripting de instalação no Windows ou para partes daquela página como “limitar as instruções de CPU disponíveis”
Baixam regularmente o código-fonte do Python, compilam com otimizações padrão de produção e instalam em
/use/local/python${version}; isso funciona de forma muito consistente desde 2018, quando saiu o Python 3.7Pela minha experiência, esses comandos são tão estáveis e consistentes que dá até para automatizar. Fico curioso para saber qual é exatamente o ponto que o autor está criticando, ou qual é a reclamação fundamental
Por exemplo, não dá para baixar o instalador do Python 3.10.14; o último instalador para Windows é o Python 3.10.11, de 5 de abril de 2023
Gosto do Rye. Ele faz exatamente o que se propõe, realmente torna agradável todo o processo de
venv/versão do Python/empacotamento e, para quem está acostumado ao modo oficial de usar Python, comopyproject.toml, parece quase transparenteAlém disso, ele faz Python parecer Cargo, e Cargo também é uma ferramenta boa de usar
Pessoalmente, acho que o pip-tools tinha um desenho muito melhor que Poetry ou Pipenv. Ele era ortogonal tanto ao pip quanto ao
virtualenv, e ambos já fazem parte do fluxo do Python há muito tempo. Dá para ver o Rye como um caso em que uma abordagem aderente aos padrões, refinada iterativamente, acaba vencendoAlém dos ganhos de velocidade por causa do Rust, gosto do fato de ele oferecer bons padrões para onde colocar o ambiente virtual (
.venv) e para como instalar várias versões do Python. Parece pequeno, mas depois que wheels resolveram o problema de instalação do numpy, esses padrões sensatos e um pip-tools embutido eram basicamente tudo o que faltava. Nesse sentido, também fico curioso sobre qual passou a ser a razão de existir do Anaconda depois do surgimento dos wheels bináriosFico feliz em ver que finalmente está melhorando
Parece que existem mais gerenciadores de pacotes Python do que apps de chat do Google
E, no aspecto de curadoria, a sugestão de confiar em uma organização pequena em vez de organizações maiores e mais antigas parece difícil de convencer. Ou seja, fico curioso sobre o que exatamente ele se propõe a fazer. O que consigo ler é algo como “um bom gerenciador de pacotes é bom, rápido e bom”, então seria bom ter uma página de comparação ou de filosofia
O cinismo do HN às vezes surpreende
Gosto do Rye. Depois de usar gerenciadores de pacotes de outras linguagens, como Cargo ou Hex, eu sempre senti falta de um sistema parecido no Python, e o Rye resolveu totalmente essa necessidade. Para quem não quer instalar várias ferramentas para gerenciar
venv, versões do Python e dependências de projeto, é muito bom ter tudo resolvido só com o RyeAinda não tenho uma noção do Rye, mas o conda também consegue gerenciar bem
venv, versões do Python e dependências de projetoEncontrar um novo gerenciador de dependências para Python é como esbarrar em um novo framework JavaScript
venvSe você precisa lidar com portabilidade, distribuir um programa ou lidar com bibliotecas que dependem de C ou de componentes do sistema operacional, é melhor começar a fazer consultoria em que, depois de receber, você não precise manter a base de código nem se responsabilizar por ela
Hoje em dia dá até para rodar CUDA e PyTorch no Docker. Em threads como esta, quando alguém diz “é só usar Docker”, a resposta comum costuma ser “não quero aprender Docker”, mas, mesmo sem nenhuma experiência com Docker, leva uns 10 minutos para subir um contêiner Python
O pixi(https://pixi.sh/latest/) é bom. Ele permite fixar a versão do Python e instalar pacotes a partir do conda e do PyPI, e é escrito em Rust
curl, passar para o bash via pipe e, em seguida, darevalna saída de um comando arbitrárioO contexto é um pouco complexo. A empresa Anaconda tinha o conda, escrito em Python, e o conda-forge, ecossistema open source, é um canal conda com bots de build de CI. Depois, sob o mesmo guarda-chuva do conda-forge, surgiu o mamba, escrito em C++, como substituto do conda; ele é um verdadeiro substituto drop-in, a ponto de
alias conda=mambadever funcionar. Hoje, o próprio conda usa libmamba como resolvedor para ganhar velocidadeDepois, o autor do mamba separou isso no pixi e reescreveu em Rust, mudando a filosofia sobre o local dos ambientes e a forma de ativação, mas mantendo compatibilidade total com ambientes conda
O conda sempre deu suporte à instalação de pacotes do PyPI via
pipem casos como quando eles não estão nos canais do conda, e o pixi dá suporte a pacotes do PyPI por meio do uv. Por isso o pixi é rápido. Segundo o post do blog, há outras otimizações que o tornam muito mais rápido até do que o mambaSe você usa pacotes que não são Python puro, o caminho certo é a família conda. A escolha do gerenciador de pacotes (conda/mamba/pixi) é secundária
O problema do PyPI é a falta de um papel de guardião. Isso se soma à falta de uma forma padronizada de empacotar pacotes que não são Python puro, fazendo com que o ambiente vaze ou, especialmente quando se distribui apenas o código-fonte e se fazem coisas estranhas no
setup.py, como incluir até o compilador para fazer bootstrap do ambiente, tornando tudo irreproduzívelDo lado do conda, o canal conda-forge faz um controle de qualidade bastante bom. Ele verifica restrições, licenças, problemas de arquivos de licença ausentes nas distribuições do PyPI, isolamento de ambiente etc. Claro que não é perfeito, pois os mantenedores podem usar um bot oficial que faz merge automático de mudanças do PyPI com restrições de versão incorretas
O problema que nenhuma ferramenta resolve hoje é centrado no PyPI. É preciso lidar com pacotes que não estão no conda, e os releases de pacotes também são, na prática, forçados a sair primeiro no PyPI
Mesmo ao instalar via conda um pacote que existe apenas no PyPI, algumas de suas dependências podem estar no conda. Até onde sei, não há gerenciador de pacotes que use pacotes do conda para satisfazer dependências de pacotes do PyPI. É possível adicionar manualmente pacotes do conda para satisfazer dependências, mas há o risco de não receber as restrições de versão corretas
Mesmo ao escrever um pacote Python open source, na maioria dos casos você precisa, ou deveria, lançá-lo primeiro no PyPI, ainda que a configuração dependa apenas de canais do conda. Isso porque releases no canal conda-forge, na prática, exigem a existência no PyPI. Por isso, mesmo para alguém como eu, o Rye ainda pode ser útil e vale a pena dar uma olhada
Estou bem animado com este projeto, mas pretendo esperar até que ele chegue a um estágio mais maduro. Gosto de todas as outras coisas que a equipe da Astral lançou, então minhas expectativas são altas
Sempre que começo um projeto Python, sinto que preciso reaprender o estado atual do gerenciamento de dependências/ambientes virtuais