De todas as críticas feitas ao Python, uma das mais válidas – e infelizmente duradoura – é o estado caótico do seu ecossistema de empacotamento. Está menos bagunçado do que costumava ser, como ilustrado de forma memorável pelo XKCD, mas ainda não é o ideal. Terceiros, como poesia e pipenv, preencheram as lacunas oferecendo ferramentas construídas com base nos padrões existentes do Python, mas projetadas em torno de fluxos de trabalho mais elegantes.

Agora temos uv, a mais nova adição ao ecossistema de instalação de pacotes Python. Criado pela Astral, a mesma equipe que mantém a ferramenta ruff Python linting, uv pretende ser um substituto completo para pip, venve muitas outras ferramentas de gerenciamento de projetos de linha de comando para Python. Ao contrário de outros gerentes de projeto Python, uv é escrito principalmente em Rust, com o objetivo de torná-lo mais rápido do que outras ferramentas de sua classe, potencialmente em ordens de magnitude.

Configurando UV e trabalhando com Venvs

Existem algumas maneiras diferentes de instalar o UV. Uma maneira comum e fácil de começar é usar pip para instalar uv em uma instalação subjacente do Python. Se essa instalação do Python estiver no sistema PATHvocê pode invocar uv apenas digitando uv na linha de comando.

Uma vez que você tenha uv instalado, você pode criar um ambiente virtual em um determinado diretório com o comando uv venv. Se você não fornecer um nome de diretório, o venv será criado no diretório .venv.

O venv uv O create se comportará exatamente como um ambiente virtual normal, com algumas pequenas alterações. Você ativa o venv da mesma forma que faria com um evento normal – por exemplo, source .venv/bin/activate no Linux/macOS ou .venvScriptsactivate no Microsoft Windows.

No entanto, o venv uv cria vontade não ter pip ou setuptools instalado por padrão. Para uvprojeto gerenciado, espera-se que você use uvferramentas de gerenciamento sempre que possível.

Usando pip com uv

uv mantém sua própria versão de pipque você acessa explicitamente por meio uv. Os comandos são os mesmos:


uv pip install flask

uv suporta a grande maioria dos pip comportamentos, como instalações editáveis, seleção de componentes opcionais (por exemplo, uv pip install "flask(dotenv)") ou instalando a partir de um git fonte.

Alguns comportamentos ainda não são suportados, mas não devem interferir no seu trabalho diário. Algumas coisas são notavelmente diferentes, no entanto.

Usando 'uv pip' com git

Se você quiser instalar um requisito de um git repositório ou GitHub, observe que você precisará usar uma sintaxe um pouco diferente da que usaria com pip sozinho. Você precisará especificar o nome do pacote a ser instalado, @e, em seguida, a fonte:


uv pip install "<package_name> @ https://github.com/<user>/<repo>"

Observe as aspas, que são necessárias para escapar do @ apropriadamente. Você também precisará passar uma sintaxe especial para usar a autenticação com git links.

Usando 'uv pip freeze' em vez de 'pip list'

Para listar o que está instalado em um determinado local, use uv pip freeze em vez de uv pip list. Os resultados podem ser redirecionados para um arquivo como normalmente faria com pip freeze.

Bloqueio, compilação e sincronização de dependências

uv fornece vários recursos para bloquear e sincronizar dependências com a lista de requisitos de um projeto.

Quando você usa uv pip freezea lista resultante terá requisitos de versão explícitos para cada pacote, o que significa que será “bloqueada” para as versões específicas em questão.

Se você quiser pegar um já existente pyproject.toml ou requirements.in arquivo e gerar uma dependência bloqueada definida como requirement.txtusar:


uv pip compile pyproject.toml -o requirements.txt
# or ...
uv pip compile requirements.in -o requirements.txt

Usando pip-compile e pip-sync com uv

uvO objetivo de longo prazo do é fornecer alternativas para múltiplas ferramentas Python. Duas das ferramentas uv podem atualmente substituir, ainda que de forma primordial, são pip-compile e pip-sync.

pip-sync pega o ambiente virtual de um projeto e sincroniza seu conjunto de pacotes com uma lista fornecida de pacotes, normalmente um requirements.txt arquivo. Com uvpara sincronizar as dependências instaladas de um projeto com uma lista de dependências bloqueadas, da mesma maneira que pip-sync ferramenta, use:


uv pip sync requirements.txt

O pip-compile ferramenta gera um requirements.in arquivo, que lista dependências “bloqueadas”, de um arquivo existente pyproject.toml ou requirements.txt arquivo:


uv pip compile .pyproject.toml -o requirements.in

Isso salva uma lista de dependências com versão bloqueada listada em pyproject.toml em requirements.inque pode então ser usado para restaurar requisitos que correspondam a uma configuração específica.

As limitações do UV

O uv O projeto ainda está em seus estágios iniciais, por isso ainda não oferece suporte a toda a gama de funcionalidades pretendidas. Muitos recursos estão incompletos (embora estejam documentados como tal) e muitos outros estão programados para serem adicionados posteriormente.

Outra questão para uv está sendo escrito em Rust – o que também é um de seus pontos fortes. Ser escrito em Rust faz uv rápido e eficiente, mas também pode dificultar a contribuição dos usuários do Python. Um desenvolvedor Python que deseja contribuir com ferramentas Python precisa principalmente aprender o processo específico para contribuir com o projeto. Mas um desenvolvedor Python que deseja contribuir de volta para uvou qualquer outra ferramenta Python escrita em Rust, também precisa aprender Rust.

Como escrever ferramentas Python em Rust ainda é um fenômeno relativamente novo, não está claro quanto impacto isso terá na forma como os desenvolvedores Python contribuem para tais projetos. Mas está claro que Rust está se tornando uma escolha válida para escrever ferramentas Python, mesmo que apenas para colocar o desempenho em primeiro lugar.