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
, venv
e 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 PATH
você 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 uv
projeto gerenciado, espera-se que você use uv
ferramentas de gerenciamento sempre que possível.
Usando pip com uv
uv
mantém sua própria versão de pip
que 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 freeze
a 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.txt
usar:
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
uv
O 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 uv
para 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.in
que 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 uv
ou 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.