pip e gerenciamento de pacotes
Nesta aula, você aprenderá a gerenciar pacotes Python com o pip, incluindo instalação, remoção, controle de versões, geração de listas de dependências e exploração do PyPI. Com exemplos práticos e exercícios, você dominará as ferramentas essenciais para manter seus projetos organizados e reproduzíveis.
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 requestsSe 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 requestsO pip também permite instalar vários pacotes de uma vez:
pip install requests numpy pandasAlém disso, você pode instalar pacotes a partir de um arquivo de requisitos (geralmente chamado requirements.txt) usando -r:
pip install -r requirements.txtEssa 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.0Para 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 requestsSe você precisa verificar qual versão está instalada, use pip show:
pip show requestsIsso 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 freezePara gerar um arquivo de requisitos, redirecione a saída:
pip freeze > requirements.txtIsso 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.4Ao 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.txtatualizado com as versões exatas ou faixas adequadas. - Prefira usar
pip installem vez desudo pip installpara 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-auditpara verificar vulnerabilidades de segurança nas dependências.
Essas práticas ajudam a manter seus projetos saudáveis e colaborativos.
Referências
- Documentação oficial do pip
- Python Package Index (PyPI)
- Python Packaging User Guide
- Semantic Versioning
- Documentação sobre ambientes virtuais
- Twine - publicação de pacotes
Exercícios
- Instale o pacote
numpyem um ambiente virtual e verifique a versão instalada usandopip show. - Gere um arquivo
requirements.txtcom as dependências do seu ambiente atual usandopip freeze. Em seguida, crie um novo ambiente virtual e instale as dependências a partir desse arquivo. - 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. - 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. - Crie um pequeno script que use a biblioteca
requestspara 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.
python -m venv meu_ambiente
source meu_ambiente/bin/activate # Linux/Mac
# ou .\meu_ambiente\Scripts\activate no Windows
pip install numpy
pip show numpypip freeze > requirements.txt
# Criar novo ambiente
python -m venv novo_ambiente
source novo_ambiente/bin/activate
pip install -r requirements.txtpip install requests==2.31.0
pip install --upgrade requests
# Observe que a versão mudará para a mais recente disponível.pip index versions requests
pip install requests==2.20.0 # exemplo de versão antigaimport requests
resposta = requests.get('https://api.github.com')
print(resposta.status_code)