Python

29 ago, 2019

Gerenciando seu projeto Python com o Pipenv

Publicidade

Gerenciar as dependências de uma aplicação Python pode ser comumente feito com um ambiente virtual (VirtualEnv) + requirements.txt. No entanto, com o aumento da complexidade do sistema e a adição de mais dependências aliada a possíveis atualizações das versões destas dependências isto pode mais atrapalhar do que ajudar. Neste cenario, o combo venv + requirements.txt se mostra insuficiente, sendo necessário partir para outras alternativas.

Se você já mexeu com projetos Javascript utilizando o ecossistema Node JS provavelmente deve ter usado NPM (Node Package Manager) ou o Yarn para gerenciar suas dependências, ou ainda o Maven em projetos Java, e, possivelmente dever ter sentido falta de uma estrutura similar no Python. Neste caso, é necessário conhecer o Pipenv.

O Pipenv é uma ferramenta que visa trazer o melhor de todos os mundos de empacotamento (bundler, composer, npm, cargo, yarn, etc) para o ecossistema Python, casando o instalador de pacotes pip e virtualenv e substituindo o requirements.txt. Lançado em 2017 por Kenneth Reitz (o criador da biblioteca requests), o Pipenv não demorou muito para ser adotado pela comunidade.

Ele cria e gerencia automaticamente um virtualenv para seus projetos, além de adicionar ou remover pacotes do seu Pipfile ao instalar ou desinstalar pacotes. Ele também gera o sempre importante Pipfile.lock, o seu querido arquivo de configuração de dependências do sistema.

Vantagens

  • Sem a necessidade de usar pip e virtualenv separadamente. Eles trabalham juntos.
  • Gera automaticamente um Pipfile, se não existir um.
  • Cria automaticamente um virtualenv em um local padrão.
  • Adiciona ou remove automaticamente pacotes para um Pipfile quando eles são desinstalados ou instalados.
  • Expõe automaticamente as vulnerabilidades de segurança.
  • Permite a visualização do gráfico de dependências (usando pipenv graph).
  • Agiliza o fluxo de trabalho carregando arquivos .env.

Instalando o Pipenv

O processo de instalação do Pipenv é bem simples. Certifique-se que você já possui o Python e o pip instalados na sua máquina com os comandos*:

$ python --version
$ pip --version

*dependendo da versão da sua distribuição o comando python pode se referir ao Python 2.x, se for este o seu caso, tente com python3 --version, assim comopip3 --version.

Então prossiga com:

$ pip install pipenv
$ pip install pipenv

Créditos: Pipenv: Python Dev Workflow for Humans

Usando na prática

Com o Pipenv devidamente instalado, é hora de criar um ambiente virtual e instalar algumas dependências. Para isso, crie um projeto qualquer apenas para exemplo (neste caso, chamarei de ‘pipenv-test’):

$ mkdir pipenv-test
$ cd pipenv-test

Crie o arquivo Pipfile e um ambiente virtual para o projeto com o comando:

$ pipenv --three

A flag --three se refere ao Python 3. Caso queira utilizar com o Python 2 utilize --two.

Ative o virtualenv do projeto com:

$ pipenv shell

Instale alguma biblioteca (neste caso, instalaremos a requests)

(pipenv-test) $ pipenv install requests

O Pipenv então atualizará nosso Pipfile com a biblioteca Requests instalada e se encarregará de criar o Pipfile.lock

Comandos básicos

  • graph: retorna um grafo de dependências do seu projeto.
  • run: executa um comando à partir do virtualenv, com quaisquer argumentos encaminhados (pipenv run pip freeze).
  • check: verifica se o projeto corresponde aos requisitos estabelecidos no Pipfile ou que os requisitos do PEP 508 estão sendo atendidos pelo ambiente atual.
  • update: atualiza as dependências do projeto.
  • --help: retorna uma lista de comandos possíveis.

Diferença entre Pipfile e Pipfile.lock

O Pipfile se destina a especificar os requisitos de pacotes para a aplicação, tanto para desenvolvimento quanto para execução.

Enquanto isso, o Pipfile.lock destina-se a especificar, com base nos pacotes presentes no Pipfile, qual a versão específica das dependências devem ser utilizadas, evitando os riscos de atualizar automaticamente os pacotes que dependem uns dos outros e quebrando a árvore de dependências do projeto.

Conclusão

O Pipenv é realmente uma mão na roda para o gerenciamento de dependências, eliminando a necessidade do requirements.txt e do combo pip + virtualenv. A produtividade proporcionada e a organização propiciada pelo Pipenv fazem dele uma alternativa pra lá de viável em qualquer projeto.

Para mais informações, considere a documentação do Pipenv e o Pipenv playground para testar comandos online de forma interativa

Referências

Gerenciando suas dependências e ambientes python com pipenv
Documentação do Pipenv
Repositório do Pipenv no GitHub
Guide to Python: Pipenv & Virtual Environments
Why pipenv > venv