Nesta aula, vamos explorar o pip, o gerenciador de pacotes padrão do Python. Com ele, você pode instalar, atualizar e remover bibliotecas de terceiros, além de gerenciar versões específicas. O pip é uma ferramenta indispensável no dia a dia de qualquer desenvolvedor Python, pois permite que você aproveite milhares de pacotes disponíveis no Python Package Index (PyPI).

Dominar o pip vai além de simplesmente instalar pacotes: envolve entender como versionar dependências, como congelar o estado do ambiente para reprodução e como publicar seus próprios pacotes. Nesta aula, vamos cobrir desde os comandos básicos até práticas recomendadas para manter seus projetos saudáveis e portáveis.

Instalando e removendo

O pip é uma ferramenta de linha de comando que acompanha a maioria das distribuições Python (a partir da versão 3.4). Para instalar um pacote, utilize o comando pip install seguido do nome do pacote. Por exemplo, para instalar a biblioteca requests, usamos:

pip install requests

Se você precisar de uma versão específica, pode especificá-la com ==, ou usar operadores como >=, <=, >, < para definir intervalos. Por exemplo:

pip install requests==2.31.0
pip install 'requests>=2.20, <3.0'

Para remover um pacote, use pip uninstall:

pip uninstall requests

O pip também permite instalar vários pacotes de uma vez:

pip install requests numpy pandas

Além disso, você pode instalar pacotes a partir de um arquivo de requisitos (geralmente chamado requirements.txt) usando -r:

pip install -r requirements.txt

Essa prática é fundamental para compartilhar dependências entre desenvolvedores e ambientes. Ao listar as dependências em um arquivo, você garante que todos usem as mesmas versões, evitando surpresas.

Boas práticas: sempre prefira instalar pacotes em um ambiente virtual (venv) para evitar conflitos com o Python do sistema. Considere também usar o pip install --upgrade para atualizar um pacote para a versão mais recente.

Versões

Gerenciar versões de pacotes é essencial para garantir a compatibilidade e a estabilidade do seu projeto. O pip permite especificar versões exatas ou faixas de versões. A sintaxe básica é:

  • == versão exata
  • >= maior ou igual
  • <= menor ou igual
  • > estritamente maior
  • < estritamente menor
  • != diferente de

Por exemplo, para instalar a versão 2.31.0 do requests:

pip install requests==2.31.0

Para instalar uma versão que seja pelo menos 2.20, mas menor que 3.0:

pip install 'requests>=2.20, <3.0'

Você também pode usar o modificador ~= para permitir atualizações dentro do mesmo release major.minor. Por exemplo, requests~=2.20 é equivalente a >=2.20, ==2.*.

Para listar as versões disponíveis de um pacote, use o comando pip index versions (em versões recentes do pip) ou consulte o PyPI diretamente:

pip index versions requests

Se você precisa verificar qual versão está instalada, use pip show:

pip show requests

Isso exibe informações detalhadas, como versão, localização, dependências e licença.

É importante entender o versionamento semântico (SemVer) usado pela maioria dos pacotes: MAJOR.MINOR.PATCH. Mudanças no MAJOR podem quebrar compatibilidade, MINOR adiciona funcionalidades sem quebrar, e PATCH corrige bugs. Ao especificar dependências, é comum usar >= para garantir a versão mínima, mas permitir atualizações de segurança.

pip freeze

O comando pip freeze é uma ferramenta poderosa para listar todos os pacotes instalados no ambiente atual, juntamente com suas versões exatas. A saída é no formato nome==versão, que pode ser facilmente usada em um arquivo requirements.txt.

pip freeze

Para gerar um arquivo de requisitos, redirecione a saída:

pip freeze > requirements.txt

Isso cria um arquivo com todas as dependências do projeto, permitindo que outros desenvolvedores (ou você mesmo em outro ambiente) instalem exatamente as mesmas versões com pip install -r requirements.txt.

No entanto, pip freeze lista todos os pacotes, incluindo dependências transitivas, o que pode incluir pacotes que não são usados diretamente. Para uma lista mais limpa, você pode usar pip list --not-required ou ferramentas como pipreqs que analisam os imports do seu código.

Uma prática comum é usar pip freeze em conjunto com ambientes virtuais: crie um ambiente, instale as dependências, e então gere o arquivo de requisitos. Isso garante que o ambiente seja reproduzível.

Exemplo de saída do pip freeze:

certifi==2023.7.22
charset-normalizer==3.2.0
idna==3.4
requests==2.31.0
urllib3==2.0.4

Ao atualizar dependências, é importante regenerar o arquivo de requisitos para manter a consistência.

PyPI

O Python Package Index (PyPI) é o repositório oficial de pacotes Python. É de lá que o pip baixa os pacotes por padrão. O PyPI hospeda milhares de pacotes, desde bibliotecas populares até projetos menores.

Para buscar um pacote, você pode usar o comando pip search (embora esteja descontinuado em versões recentes do pip) ou acessar o site pypi.org e usar a busca. No site, você encontra documentação, versões, estatísticas de downloads e links para o código-fonte.

Para publicar seu próprio pacote no PyPI, você precisa de uma conta e usar ferramentas como setuptools e twine. O processo envolve criar um setup.py ou pyproject.toml, gerar distribuições (sdist e wheel) e enviar com o twine.

Além do PyPI, existem repositórios alternativos, como o Test PyPI (para testes) e repositórios privados. Você pode configurar o pip para usar um índice diferente com a opção -i ou definindo variáveis de ambiente.

Exemplo de instalação de um pacote a partir de um índice alternativo:

pip install -i https://test.pypi.org/simple/ meu-pacote

É importante verificar a confiabilidade dos pacotes antes de usá-los, pois o PyPI é aberto e qualquer pessoa pode publicar. Sempre prefira pacotes bem mantidos, com boa documentação e muitos downloads.

Boas práticas e observações finais

Ao gerenciar pacotes, siga estas recomendações:

  • Use ambientes virtuais para isolar dependências de cada projeto.
  • Mantenha um arquivo requirements.txt atualizado com as versões exatas ou faixas adequadas.
  • Prefira usar pip install em vez de sudo pip install para evitar conflitos com o sistema.
  • Atualize o próprio pip regularmente: pip install --upgrade pip.
  • Verifique as licenças dos pacotes para garantir conformidade com seu projeto.
  • Use ferramentas como pip-audit para verificar vulnerabilidades de segurança nas dependências.

Essas práticas ajudam a manter seus projetos saudáveis e colaborativos.

Referências

Exercícios

  1. Instale o pacote numpy em um ambiente virtual e verifique a versão instalada usando pip show.
  2. Gere um arquivo requirements.txt com as dependências do seu ambiente atual usando pip freeze. Em seguida, crie um novo ambiente virtual e instale as dependências a partir desse arquivo.
  3. Especifique uma versão exata (por exemplo, requests==2.31.0) e instale-a. Depois, tente atualizar para a versão mais recente e observe o que acontece com a saída do comando.
  4. Pesquise no PyPI um pacote de sua escolha e verifique as versões disponíveis usando pip index versions. Instale uma versão específica que não seja a mais recente.
  5. Crie um pequeno script que use a biblioteca requests para fazer uma requisição HTTP a uma API pública (por exemplo, https://api.github.com) e imprima o status code. Execute-o após instalar a dependência.

✓ Resposta:
python -m venv meu_ambiente
source meu_ambiente/bin/activate  # Linux/Mac
# ou .\meu_ambiente\Scripts\activate no Windows
pip install numpy
pip show numpy

✓ Resposta:
pip freeze > requirements.txt
# Criar novo ambiente
python -m venv novo_ambiente
source novo_ambiente/bin/activate
pip install -r requirements.txt

✓ Resposta:
pip install requests==2.31.0
pip install --upgrade requests
# Observe que a versão mudará para a mais recente disponível.

✓ Resposta:
pip index versions requests
pip install requests==2.20.0  # exemplo de versão antiga

✓ Resposta:
import requests
resposta = requests.get('https://api.github.com')
print(resposta.status_code)