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
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