Python: Ambientes virtuais com pyenv + pipenv + debian like


Ambientes virtuais com pyenv + pipenv + debian like

Em Python pode-se gerenciar inumeras versões de projetos com ambientes virtuais distintos e dependências independentes por projeto ou como é bastante conhecido virtualenv.


Dependências

$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev libssl1.0-dev 

Requisitos

Vamos partir do princípio que há um linux do tipo debian like (debian, ubuntu, ou outro derivado de debian), totalmente configurado e com acesso a internet.

Escopo

  1. debian like, Debian GNU/Linux 8.0; equivalente ou posterior
  2. bash, GNU bash, versão 4.0+
  3. pyenv
  4. pipenv
O pacote pyenv serve para controlar e instalar facilmente as versões disponíveis de Python, jython, anaconda, miniconda, ironpython, pypy e stackless.

O pacote pipenv serve para gerenciar e fixar (pinar) de forma simples e eficiente os pacotes do projeto e todas as suas dependências, com a finalidade de garantir a replicação do ambiente em sua versão de criação original.

Instalação pyenv

A maneira mais fácil de instalar o pyenv, é através do script de instalação forncecido pelo mantenedor.

curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

Configuração 

 Neste tutorial vamos definir o diretório de projetos em "~/projetos", acrescentar "~/.pyenv" em PATH e ativar pyenv

$ cat > ~/.bashrc << fim
export PYENV_ROOT="${HOME}/.pyenv/" 
export PROJECT_HOME="${HOME}/projetos"
export PYENV_VIRTUALENV_DISABLE_PROMPT=0
export PATH="${PYENV_ROOT}/bin:$PATH"
eval "$(pyenv virtualenv-init -)"
eval "$(pyenv init -)" 
fim 

Próximo passo é instalar o CPython nas versões desejadas: 3.8.0, 3.7.5 e 2.7.14.
pyenv install 3.8.0
pyenv install 3.7.5
pyenv install 2.7.16

Evite a tentação de poluir sua instalação global do Python, com instalações de modulos extras, pois isto evitará grandes problemas no futuro, principalmente no caso de recuperação em ambientes. Para tornar esta configuração mais amistosa, sem favorecer futura situação de difícil recuperação, criemos instalações "pyenv-virtualenv" de uso global. Exemplo com jupyter/notebook

criar o virtualenv

pyenv virtualenv 3.8.0 jupyter3
pyenv virtualenv 3.8.0 tools3
pyenv virtualenv 3.7.5 jupyter3
pyenv virtualenv 3.7.5 tools3
pyenv virtualenv 2.7.16 ipython2
pyenv virtualenv 2.7.16 tools2

Instalar o módulo necessário para python3

pyenv activate jupyter3
pip install jupyter
python -m ipykernel install --user
pyenv deactivate

Instalar o módulo necessário para python2

pyenv activate ipython2
pip install ipykernel
python -m ipykernel install --user
pyenv deactivate

Instalar demais ferramentas globais que suportam Python3

pyenv activate tools3
pip install youtube-dl gnucash-to-beancount rows 
pyenv deactivate

Instalar ferramentas globais que suportam Python2

pyenv activate tools2
pip install rename s3cmd fabric mercurial
pyenv deactivate

Instalar pipenv

pyenv activate pipenv
pip install pipenv
pyenv deactivate

Ativar todas essas versões do Python e virtualenvs especiais para funcionarem cooperativamente

pyenv global 3.8.0 3.7.5 2.7.16 jupyter3 ipython2 tools3 tools2 pipenv

Criando o diretório do projeto para python 3.8

mkdir ~/projetos/proj1
cd ~/projetos/proj1
pipenv shell --python 3.8
python -V

Criando o diretório do projeto para python 3.7.16

mkdir ~/projetos/proj2
cd ~/projetos/proj2
pipenv shell --python 2.7.16
python -V

Criando o diretório do projeto para python 3.7.5

mkdir ~/projetos/proj3
cd ~/projetos/proj3
pipenv shell --python 3.7.5
python -V

Criar novo ambiente de projeto para versão python inexistente

#versão inexistente ao sistema
pyenv install 3.6.8

#diretório do projeto
mkdir ~/projetos/proj4
cd ~/projetos/proj4

# Virtualenv para o projeto
pipenv shell --python 3.6.8

#confirmação de python
python -V
pip freeze

# Atualização conforme requirements.txt (se houver)
pipenv install -r requirements.txt
pip freeze

# Atualização conforme Pipfile (se houver)
pipenv install -d
pip freeze

Atualizar ambiente de projeto para versão python inexistente

Certifique-se de que não há um subshell ativo.
# acesse do diretório que será atualizado
$ cd ~/projetos/proj3

# Backup das dependências do ambiente via requirements.txt
# Etapa desnecessária se utilizado Pipfile/Pipfile.lock)
$ pipenv lock --requirements > requirements.txt

# Atualizar versões disponíveis para instalação através do pyenv
$ pyenv update

# Instalar versão inexistente ao sistema
$ pyenv install 3.8.2

# Remover ambiente pipenv do projeto atual
$ pipenv --rm

# Ativar ambiente pipenv com a nova versão de Python
$ pipenv shell --python 3.8.2

# Atualização de dependências conforme requirements.txt (se houver)
$ pipenv install -r requirements.txt 

# Atualização de dependências conforme Pipfile (se houver)
vim Pipfile de: [requires] python_version = "3.7" para: [requires] python_version = "3.8"
$ pipenv install -d # Aferir instalação e respectivas versões $ pipenv check $ python -V $ pipenv run pip freeze $ pip freeze

Versões

  • 2019/11/19 06:56

Referências

  • https://brito.blog.incolume.com.br/2020/03/atualizar-ambiente-linux-pyenv-pipenv.html
  • https://medium.com/trainingcenter/utilizando-pyenv-para-manter-multiplas-vers%C3%B5es-de-python-em-seus-projetos-8fce76d35b99
  • https://prassanna.io/blog/pyenv-and-pipenv-for-the-perfect-python-environment/
  • https://dev.to/writingcode/the-python-virtual-environment-with-pyenv-pipenv-3mlo
  • https://klauslaube.com.br/2018/06/11/tchau-requirements-ola-pipfile.html

Comentários