O simples e poderoso Pyenv

Num certo dia, eu resolvi deixar a preguiça de lado e atualizar a versão do Mac OS X para o El Capitan. Na cara e coragem, e dotado de uma ingenuidade ímpar, simplesmente apertei o botão Update e deixei com que os deuses resolvessem qual seria o destino do meu workspace após essa fatídica operação.

Obviamente, algumas ferramentas deixaram de funcionar, incluindo a minha instalação "system wide" do pip e o meu virtualenvwrapper.

Após algum tempo "googlando" eu encontrei o Pyenv, e vou compartilhar com você a razão pela qual ele é uma excelente ideia.

Múltiplas versões de Python, sem dor de cabeça

O Pyenv é uma ferramenta que te permite selecionar qual a versão do Python você está utilizando, de maneira muito fácil e prática.

Antes de conhecer o Pyenv, eu geralmente baixava o código fonte e compilava as versões "adicionais" do Python (2.6, 3.3, 3.4, etc) no /opt/ da minha máquina, utilizando a versão do sistema (2.7.x) para a maioria dos projetos que desenvolvia. Aí no momento de criação do meu virtualenv, apontava o executável da linguagem para a versão específica.

Com essa ferramenta eu deixo uma versão do sistema intacta, e utilizo de forma completamente isolada a determinada versão do Python do qual necessito, com alguns atalhos que me auxiliam na transição de uma versão para a outra.

Instalando

Instalar o Pyenv é tão trivial quanto dar um pip install. Por ele não depender do Python (e ser em shell puro) podemos utilizar o seu instalador de linha de comando:

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

Com o comando pyenv install -l somos apresentados a uma lista de possíveis versões a serem instaladas através do utilitário (indo de Python 2.1 até PyPy).

Suponha que você queira instalar a versão 3.5.1 da linguagem:

$ pyenv install 3.5.1

Genial, não?

Transitando entre versões

Para utilizar a versão instalada no terminal que está aberto, usamos o parâmetro shell:

$ pyenv shell 3.5.1
$ python -V
Python 3.5.1

Talvez seja necessário executar o comando pyenv rehash, caso você não esteja obtendo o resultado esperado.

Com o comando versions obtemos as versões disponíveis no computador:

$ pyenv versions
system
* 3.5.1 (set by PYENV_VERSION environment variable)

O asterisco indica a versão em uso atualmente.

Com o comando local, setamos uma determinada versão do Python para um determinado path. Exemplo:

$ cd ~/Workspace/blog
$ pyenv local 3.5.1
$ pyenv version
3.5.1 (set by /Users/klaus/Workspace/blog/.python-version)

O Pyenv criará um arquivo .python-version no diretório, e todo o momento que você acessá-lo trocará a versão corrente do interpretador, automaticamente.

"Minha cara após o update do El Capitan (thewrap.com)"
Minha cara após o update do El Capitan (thewrap.com)

Um workaround para fazer o meu ambiente de trabalho funcionar, no El Capitan, foi baixar uma versão 2.7.x do Python e torná-la global. Exemplo:

$ pyenv install 2.7.10
$ pyenv rehash
$ pyenv global 2.7.10
system
* 2.7.10 (set by /usr/local/opt/pyenv/version)
3.5.1

Com isso, o comando pip voltou a funcionar "system wide", bem como as minhas integrações do zsh com o virtualenvwrapper.

Bônus: virtualenvwrapper

E assim a minha vida continuou pacata e serena... até o momento que eu tiver que criar um virtualenv para uma versão diferente da minha versão global.

O Pyenv com virtualenvwrapper não se entendem muito bem. Para facilitar a nossa vida, temos o pyenv-virtualenvwrapper:

$ pip install virtualenvwrapper
$ brew install pyenv-virtualenvwrapper

É necessário ativá-lo em seu shell:

$ pyenv virtualenvwrapper

E agora sim, criar o seu ambiente virtual:

$ pyenv shell 3.5.1
$ mkvirtualenv test
Using base prefix '/usr/local/opt/pyenv/versions/3.5.1'
New python executable in /Users/klaus/.virtualenvs/test/bin/python3.5
Also creating executable in /Users/klaus/.virtualenvs/test/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /Users/klaus/.virtualenvs/test/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/klaus/.virtualenvs/test/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/klaus/.virtualenvs/test/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/klaus/.virtualenvs/test/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/klaus/.virtualenvs/test/bin/get_env_details

E "esquecer" do comando pyenv a partir do momento que você tem os seus virtualenvs criados:

$ workon meu_projeto_em_py_27
$ python -V
Python 2.7.10

$ workon test
$ python -V
Python 3.5.1

Considerações finais

O Pyenv é, assim como o virtualenv, aquele tipo de ferramenta que te mantém são e salvo quando a sua necessidade é trabalhar com versões completamente diferentes do Python.

Infelizmente, o seu uso com o virtualenvwrapper não é lá tão smooth (mas está longe de ser complicado). Para facilitar a vida, talvez adicionar o comando pyenv virtualenvwrapper ao seu .bash_profile ou .zshrc seja uma dica interessante.

Ou ainda, você pode utilizar o virtualenvwrapper para os projetos Python 2.7.x, e o pyvenv para projetos > 3.2.

Até a próxima.

Referências