Gerenciando dependências de aplicações#

O tutorial de instalação do pacote cobriu os fundamentos da configuração para instalar e atualizar pacotes Python.

No entanto, executar esses comandos interativamente pode se tornar tedioso até mesmo para seus próprios projetos pessoais, e as coisas ficam ainda mais difíceis ao tentar configurar ambientes de desenvolvimento automaticamente para projetos com vários contribuidores.

Este tutorial orienta você no uso de Pipenv para gerenciar dependências para uma aplicação. Ele mostrará como instalar e usar as ferramentas necessárias e fará recomendações fortes sobre as melhores práticas.

Lembre-se de que Python é usado para muitos propósitos diferentes e, precisamente, como você deseja gerenciar suas dependências pode mudar com base em como você decide publicar seu software. A orientação apresentada aqui é mais diretamente aplicável ao desenvolvimento e implantação de serviços de rede (incluindo aplicações web), mas também é muito adequada para gerenciar ambientes de desenvolvimento e teste para qualquer tipo de projeto.

Para alternativas, veja Outras ferramentas para gerenciamento de dependências de aplicações.

Instalando Pipenv#

Pipenv é um gerenciador de dependências para projetos Python. Se você está familiarizado com o npm do Node.js ou o bundler do Ruby, é semelhante em espírito a essas ferramentas. Enquanto pip por si só costuma ser suficiente para uso pessoal, Pipenv é recomendado para projetos colaborativos por ser uma ferramenta de nível superior que simplifica o gerenciamento de dependências para casos de uso comuns.

Use pip para instalar Pipenv:

python3 -m pip install --user pipenv
py -m pip install --user pipenv

Nota

fIsso faz uma instalação do usuário para evitar quebrar qualquer pacote do sistema. Se pipenv não estiver disponível em seu shell após a instalação, você precisará adicionar o diretório binário da base de usuário ao seu PATH. Veja Instalando no Site do Usuário para mais informações.

Instalando pacotes para seu projeto#

O Pipenv gerencia dependências por projeto. Para instalar pacotes, mude para o diretório do seu projeto (ou apenas um diretório vazio para este tutorial) e execute:

cd myproject
pipenv install requests

Pipenv irá instalar a biblioteca Requests e criar um Pipfile para você no diretório do seu projeto. O Pipfile é usado para rastrear quais dependências seu projeto precisa no caso de você precisar reinstalá-las, como quando você compartilha seu projeto com outras pessoas. Você deve obter uma saída semelhante a esta (embora os caminhos exatos mostrados variem):

Creating a Pipfile for this project...
Creating a virtualenv for this project...
Using base prefix '/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6'
New python executable in ~/.local/share/virtualenvs/tmp-agwWamBd/bin/python3.6
Also creating executable in ~/.local/share/virtualenvs/tmp-agwWamBd/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: ~/.local/share/virtualenvs/tmp-agwWamBd
Installing requests...
Collecting requests
  Using cached requests-2.18.4-py2.py3-none-any.whl
Collecting idna<2.7,>=2.5 (from requests)
  Using cached idna-2.6-py2.py3-none-any.whl
Collecting urllib3<1.23,>=1.21.1 (from requests)
  Using cached urllib3-1.22-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Using cached chardet-3.0.4-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests)
  Using cached certifi-2017.7.27.1-py2.py3-none-any.whl
Installing collected packages: idna, urllib3, chardet, certifi, requests
Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22

Adding requests to Pipfile's [packages]...

Usando pacotes instalados#

Agora que Requests está instalado você pode criar um main.py simples para usá-lo:

import requests

response = requests.get('https://httpbin.org/ip')

print('Your IP is {0}'.format(response.json()['origin']))

Então, você pode executar este script usando pipenv run:

pipenv run python main.py

Você deve obter uma saída similar a esta:

Your IP is 8.8.8.8

Usar pipenv run garante que seus pacotes instalados estejam disponíveis para seu script. Também é possível gerar um novo shell que garante que todos os comandos tenham acesso aos seus pacotes instalados com pipenv shell.

Próximos passos#

Parabéns, agora você sabe como gerenciar dependências e ambientes de desenvolvimento com eficácia em um projeto colaborativo Python! ✨ 🍰 ✨

Se você estiver interessado em criar e distribuir seus próprios pacotes Python, veja o tutorial sobre empacotamento e distribuição de pacotes.

Observe que quando sua aplicação inclui definições de pacotes fonte do Python, elas (e suas dependências) podem ser adicionadas ao seu ambiente de pipenv com pipenv install -e <caminho-relativo-ao-diretório-fonte> (por exemplo, pipenv install -e . ou pipenv install -e src).

Outras ferramentas para gerenciamento de dependências de aplicações#

Se você achar que essa abordagem específica para gerenciar dependências de aplicações não está funcionando bem para você ou seu caso de uso, convém explorar essas outras ferramentas e técnicas, listadas em ordem alfabética, para ver se uma delas se encaixa melhor:

  • hatch para uma cobertura opinativa de ainda mais etapas no fluxo de trabalho de gerenciamento de projeto, como incrementar versões e criar novos projetos básicos a partir de modelos de projeto.

  • micropipenv <https://github.com/thoth-station/micropipenv>`_ para um invólucro leve do pip que oferece suporte a requirements.txt, arquivos de bloqueio de Pipenv e de Poetry ou convertê-los em saída compatível com pip-tools. Projetado para aplicações em contêineres Python, mas não se limitando a elas.

  • PDM for a modern Python package management relying on standards such as PEP 517 and PEP 621.

  • pip-tools para criar um arquivo de bloqueio de todas as dependências de uma lista de pacotes usados diretamente em um projeto e garantir que apenas essas dependências estão instalados.

  • Poetry para uma ferramenta comparável em escopo a Pipenv que se concentra mais diretamente em casos de uso onde o projeto sendo gerenciado é estruturado como um pacote Python distribuível com um arquivo pyproject.toml válido. Por outro lado, Pipenv explicitamente evita fazer a suposição de que a aplicação na qual está sendo trabalhada será compatível com a distribuição como um pacote Python instalável com pip.