- uv simplifica de forma radical a instalação do Python e o gerenciamento de ambientes virtuais, resolvendo os problemas complexos de configuração de ambiente no ecossistema Python
- Escrito em Rust, combina velocidade e estabilidade e lida com instalação de versões do Python, gerenciamento de pacotes e resolução de dependências com um único comando
- Reconhece automaticamente o
pyproject.tomlpara configurar o ambiente do projeto, e comuv syncé possível reproduzir entre equipes um ambiente de desenvolvimento totalmente idêntico - Com comandos como
uv run,uv addeuvx, é possível executar sem ativar o ambiente virtual, além de adicionar pacotes e fazer execuções pontuais - Ao garantir consistência na instalação e na execução do Python, o uv é visto como um ponto de virada que eleva bastante a produtividade dos desenvolvedores e a eficiência da colaboração
Visão geral do uv
- uv é uma ferramenta gratuita e open source de gerenciamento de Python desenvolvida pela Astral, com o objetivo de simplificar processos complexos de configuração de ambiente
- A Astral é a equipe por trás de ferramentas de desenvolvimento Python como o Ruff
- O uv oferece instalação de versões do Python, instalação de pacotes, gerenciamento de ambientes virtuais e resolução de dependências, sendo muito mais rápido do que ferramentas existentes
- Foi desenvolvido em Rust, tem desempenho excelente e funciona em praticamente todas as plataformas, como macOS, Linux e Windows
Instalação e uso básico
- A instalação é muito simples e pode ser feita com uma única linha de comando via
curlou PowerShell- Linux/Mac:
curl -LsSf https://astral.sh/uv/install.sh | sh - Windows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
- Linux/Mac:
- Como não altera a instalação existente do Python, é possível testar com segurança
Gerenciamento do ambiente do projeto
- O uv gerencia automaticamente um ambiente virtual para cada projeto Python e configura o ambiente ao reconhecer o arquivo
pyproject.toml- No
pyproject.tomlsão definidos a versão do Python, a lista de dependências e o nome e a versão do projeto - Exemplo:
[project] name = "my_project" version = "1.0.0" requires-python = ">=3.9,<3.13" dependencies = ["astropy>=5.0.0", "pandas>=1.0.0,<2.0"] - Essa abordagem fornece uma definição de ambiente mais clara e padronizada do que o pip
- No
Criação de novos projetos
- É possível criar facilmente um novo projeto com o comando
uv init- Ele cria automaticamente arquivos essenciais como
pyproject.tomleREADME.md - Oferece diferentes formas de inicialização com opções como
--baree--package - É possível ver as opções detalhadas com
uv init --help
- Ele cria automaticamente arquivos essenciais como
Sincronização de projetos existentes
- Se o projeto tiver
pyproject.toml, ele pode ser usado imediatamente com o comandouv sync- Instala automaticamente a versão do Python
- Cria um ambiente virtual no diretório
.venv - Gera o
uv.lock, que registra as informações exatas de versão de todos os pacotes
- Com o comando
uv run, é possível executar scripts Python sem ativar o ambiente- Ex.:
uv run myscript.py,uv run jupyter lab
- Ex.:
Gerenciamento de dependências e versões do Python
- Com o comando
uv add numpy>=2.0, é possível adicionar e gerenciar dependências automaticamente- Não é necessário editar o
pyproject.tomlmanualmente
- Não é necessário editar o
- Com o comando
uv python pin 3.12.9, é possível fixar uma versão específica do Python, garantindo a reprodutibilidade do ambiente
uvx: execução pontual rápida
uvxé um comando que permite executar ferramentas imediatamente, sem configuração adicional de ambiente- Ex.:
uvx ruff,uvx jupyter lab,uvx --with pandas,pyarrow ipython - Com base em cache, permite reexecução muito rápida e é útil para trabalhos experimentais
- Ex.:
- Com isso, o desenvolvedor pode montar facilmente um ambiente temporário de execução sem ficar preso a ambientes virtuais
Se isso ainda não te convenceu: uma nota pessoal
- Durante o desenvolvimento do The Astrosky Ecosystem, o uv foi adotado para unificar ambientes Python em vários sistemas operacionais
- Isso ajudou todos os desenvolvedores e servidores a usarem instalações de Python e versões de dependências totalmente idênticas
- O uv também gerencia o ambiente Python no GitHub Actions e em servidores de produção
- Graças ao uv, desapareceram os problemas de divergência entre ambientes de instalação e teste, e a colaboração entre desenvolvedores ficou mais simples
Conclusão
- O uv resolve na raiz a complexidade da instalação e do gerenciamento do Python, permitindo que desenvolvedores colaborem com estabilidade em um mesmo ambiente
- Graças à alta velocidade e à estabilidade proporcionadas pelo Rust, o uv é avaliado como “a maior inovação a acontecer no ecossistema Python na última década”
7 comentários
Eu achava que o pdm era quase muito parecido com o uv, mas não se fala muito sobre o pdm.
Tenho usado bastante em ML e Web, e espero que o uv logo se torne uma tecnologia entediante haha
Parece que as postagens sobre
uvagora não mudam muito de conteúdo.Maven e Gradle também..
Quando vejo um repositório que só tem
requirementse não tempyproject.toml, já parece ultrapassado agora haha;Opiniões no Hacker News
Antes eu ouvia que o tooling de Python já era suficiente, mas agora é satisfatório ver os desenvolvedores Python experimentando um ecossistema baseado em lockfile como npm, cargo ou bundler e percebendo as vantagens
O npm também tem problemas, mas instalações consistentes e arquivos de lock são um conceito realmente excelente
É surpreendente que o gerenciamento de ambiente tenha sido tão inconveniente por tanto tempo
Não sei se tantas tentativas fracassaram simplesmente por causa da dificuldade do gerenciamento de pacotes ou se era preciso capital de risco
pip freeze > requirements.txtepip install -r requirements.txtSe você não usar intervalos de versão, o requirements.txt na prática funciona como lockfile
Por isso acho um pouco exagerada essa febre atual por “lockfile oficial”
Acho que a chegada do yarn foi um grande fator para o npm melhorar
É mais rápido, mais eficiente e determinístico
Para mais detalhes, veja pnpm.io/motivation
Com scripts do uv, foi possível distribuir clientes/servidores MCP em um único arquivo
Texto relacionado: MCP server in a file
Como a maioria dos scripts é de arquivo único, a vida fica muito mais simples se você adicionar isto no topo
#!/usr/bin/env -S uv run --scriptAssim o script funciona como um executável independente, e o uv instala automaticamente os módulos necessários
porque o autor do script pode esconder dependências maliciosas
Seria bom ter um recurso de whitelist
Mas alguns pacotes não têm a data de release detectada (ex.: yaml)
/usr/bin/env -S, e nos nomes das dependências deve-se usar o nome do pacote de distribuição usado no comandouv pip installIsso segue o padrão PEP 723 e o pipx também oferece suporte
Antes de usar uv, eu não tinha interesse em Rust, mas por causa do uv acabei migrando para Rust o código sensível a desempenho
Eu queria que o conda desaparecesse de vez. Em clusters de ML, os ambientes conda ficam grandes demais e a reprodutibilidade é ruim
Antes eu já estava bem satisfeito com a combinação pyenv + venv + pip + pipx, mas o uv
uv run,uv addetc.Em vez de ativar o ambiente, é muito mais prático colocar
uvantes do comandoO gerenciamento de versões do Python também fica fácil, e há uma sensação de batteries included por projeto
Ainda não sei como será a estabilidade no longo prazo, mas já estou usando por padrão em projetos novos
Tem gente que não gosta de o uv detectar o ambiente automaticamente
Não vejo muito o valor do gerenciamento de versões do Python, mas com uv recriar ambientes ficou muito mais rápido
uvtorna a execução dos comandos mais stateless, o que é conveniente em colaboraçãouvainda é útil.venvEsse post de blog bate quase exatamente com a minha experiência
Houve menos atrito e mais simplicidade
Gostaria que a comunidade Python adotasse o uv como ferramenta padrão
Ferramentas baseadas em Rust mudaram completamente a velocidade de feedback
Mas fico curioso sobre como a Astral ganha dinheiro. Ela recebeu investimento, mas não tem produto pago
Por exemplo: um registro de pacotes interno
Entrevista relacionada: Entrevista com Charlie Marsh
Se há 10 milhões de desenvolvedores Python, acho que o uv também é perfeitamente monetizável
Pessoalmente, acho type annotations e a remoção do GIL mais importantes do que o uv
O uv ainda está em estágio inicial e também tem inconvenientes. No fim, é apenas mais um gerenciador de pacotes
O novo resolver do pip e o aumento na distribuição via wheels tiveram papel importante
Texto relacionado: Wheels are faster for pure Python
Também é interessante por ter sido escrito em Rust. É uma estrutura que suporta outras linguagens, como o LLVM
Do ponto de vista do usuário final, o uv é muito melhor, e se for inconveniente para mantenedores, basta enviar feedback
Se surgir um modo estrito, talvez até haja ganho de desempenho, mas isso entra em conflito com a filosofia da linguagem
Ainda assim, se o conda desaparecer, eu toparia migrar para o uv
Eu não gosto do uv
uv pip, então nem é uma substituição completaMas pip e venv também quebram com frequência e ficam mais difíceis de depurar
O uv não substitui o ruff
Nem é preciso mexer nas variáveis de ambiente
uv pipnão chama o pip; ele fornece uma interface compatívelNa prática, é o uv que substitui o pip
Fico curioso sobre quais problemas de compatibilidade com Docker exatamente existem
uv add,uv sync,uv runé muito mais ergonômico e rápidoPara mais detalhes, veja a documentação uv dependencies concepts
O
uvé bom por ser rápido, mas também fico pensando como teria sido se tivessem seguido na direção de melhorar opip.