Ultra Violent Python

dev

Imagina se, numa realidade alternativa, você tivesse uma maneira fácil de criar e gerenciar seus projetos Python? Sem o caos de gerar um monte de arquivos de configuração, ambientes virtuais loucos e toda hora instalar algo com pip e –break-system-packages? Apenas pare e conheça o Ultra Violent Python!

A violência nunca é a resposta, ela é uma pergunta, e a resposta sempre será SIM!

Se você já se estressou com pip, virtualenv, pyenv, pip-tools, twine, poetry e afins, respire fundo: o Ultra Violent Python (agora chamado de uv) chegou para simplificar sua vida. Escrito em Rust, o uv é um gerenciador de pacotes e projetos para Python que promete ser mais rápido que o esquilo do filme “Os sem floresta” depois de tomar um energético.

Infelicidade total!

Mas por que Ultra Violent?

“Ultra Violent Python” não é porque as cobrinhas são agressivas, mas porque é exatamente o que eu queria fazer com meu computador antes de conhecer o uv. Quebrar tudo. Com gosto. E ter uma máquina do tempo para fazer isso infinitamente.

Com o uv, você pode:

  • Instalar e gerenciar múltiplas versões do Python;
  • Criar e gerenciar ambientes virtuais automaticamente;
  • Lidar com dependências de projetos de forma eficiente;
  • Reproduzir ambientes de trabalho com facilidade;
  • Construir e publicar pacotes Python.

Em resumo, o uv é o Severino que faltava para o Python.


Antes e depois do uv
ANTES DO UV:
> pip install isso
> virtualenv aquilo
> source ativa_env
> esqueci a versão do Python
> deu ruim

DEPOIS DO UV:
> uv init meu_projeto
> uv add requests
> uv run
🧘🏻‍♀️ paz interior

Tá bom. Mas como faz para instalar e usar o uv?

Em teoria, o jeito ninja de instalar a versão mais recente:

No MacOS e Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh

No Windows, via powershell:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Se preferir, pode instalar o uv usando o pipx:

pipx install uv

Ou, se estiver se sentindo ousado:

pip install uv

Mas cuidado: instalar diretamente com pip pode bagunçar seu ambiente global. Use com a devida moderação. Mentira, joga logo um –break-system-packages junto com o comando e GG.


Pego na mentira? Cheque se há atualizações!

Menti lá em cima sobre instalar a última versão. É, às vezes faço isso aqui no meu site.

Mentira. Só falo verdades. Você instalará a última versão, mas é sempre bom rodar um bom e velho update de vez em quando.

Faz assim:

uv self update

Se instalou via pipx:

pipx upgrade uv

Instalei essa bagaça e agora?

Agora você pode começar a usar o uv para gerenciar seus projetos Python. Para criar um projeto novo, navegue até o diretório em que você deseja criar o projeto e rode:

uv init cobra_vilao

Isso cria a estrutura básica do projeto, incluindo:

  • Um ambiente virtual .venv;
  • Um arquivo pyproject.toml com as configurações do projeto;
  • Um README.md vazio;
  • Um arquivo main.py com um simples “Hello World”.

Para rodar o script principal:

uv run main.py

Na primeira execução, o uv cria o ambiente virtual e executa o script. Simples assim.


Mas e o problema das dependências?

Calma, meu jovem Padawan, as dependências agora serão gerenciadas em nível de projeto, não sendo mais necessário rodar quinhentos mil comandos de ambiente virtuais ou instalar diretamente no SO com a marretada –break-system-packages.

Para adicionar uma dependência:

uv add requests

Para atualizar:

uv pip install --upgrade requests

Para remover:

uv remove requests

Para dependências de desenvolvimento:

uv add --dev pytest

Para garantir que todos tenham o mesmo ambiente:

uv lock
uv sync

Construindo e Publicando Pacotes

O comando uv build serve para empacotar seu projeto Python — ou seja, ele prepara tudo para você distribuir o projeto como um pacote instalável (via PyPI, por exemplo). Ele funciona como um construtor (builder) que segue o padrão do PEP 517 - link: https://go.alv.gg/pep

Na prática, o que ele faz é:

  • Lê o seu pyproject.toml;
  • Gera os arquivos .tar.gz (source distribution) e .whl (wheel);
  • Coloca tudo bonitinho na pasta dist/.

Exemplo de estrutura de projeto:

cobra_vilao/
├── cobra_vilao/
│   ├── __init__.py
│   └── core.py
├── tests/
│   └── test_core.py
├── README.md
├── LICENSE
├── pyproject.toml
├── uv.lock
└── .venv/

E um pyproject.toml básico:

[project]
name = "cobra_vilao"
version = "0.1.0"
description = "Cobras nervosas que quebram computadores com pip"
authors = [{ name="Alvin", email="cobra.master@alv.gg" }]
dependencies = ["requests"]

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"

Depois do build:

uv build

Você terá uma pasta dist/ assim:

cobra_vilao/
├── dist/
│   ├── cobra_vilao-0.1.0.tar.gz
│   └── cobra_vilao-0.1.0-py3-none-any.whl

uv é rápido?

Sim, tão rápido que parece que não fez nada. Você até dá um ls achando que ele bugou. Spoiler: não bugou. Ele só é rápido, rápido de verdade (tks, Rust!).


Ficando de boas e concluindo

O uv é uma ferramenta poderosa que simplifica o gerenciamento de projetos Python. Com ele, você pode, muito de boas:

  • Instalar e gerenciar múltiplas versões do Python;
  • Criar e gerenciar ambientes virtuais automaticamente;
  • Lidar com dependências de forma eficiente;
  • Construir e publicar pacotes com facilidade.

Felicidade e paz!

Se você está cansado de lidar com múltiplas ferramentas para gerenciar seus projetos Python, o uv é a solução tudo-em-um que você procurava.

E se mesmo assim você ainda prefere poetry (https://go.alv.gg/poetry), tudo bem… cada um escolhe o próprio sofrimento.

Mais informações: