Python & Pyenv - Mas allá de los entornos virtuales

develop python virtualenv linux osx

Imgur

Hemos hablado de los entornos virtuales de Python con Virtualenv y Virtualenvwrapper y como nos facilita el trabajar con diferentes versiones de librerias.

En lo personal pienso que lo mejor es que los desarrollos y sus despliegues sean lo mas independientes posible, en versiones de lenguaje y bibliotecas, de igual forma en el proceso de desarrollo, yo prefiero no depender de las versiones del lenguaje que vengan con el SO.

Aqui entra Pyenv, un manejador de versiones de python, los que hemos usado Ruby podemos conocer a RVM, esta herramienta que nos permite instalar diferentes versiones de Ruby segun nuestra necesidad, pues Pyenv es similar a RVM en la forma que nos permite instalar y utilizar diferentes versiones de python, podemos definir una version global o una version especifica para un proyecto.

Instalando Pyenv

Linux

Como es costumbre, podemos encontrar Pyenv en repositorios de nuestras distribuciones, o mejor, instalarlo desde su sitio y tenerlo lo mas actualizado posible. En su sitio podemos encontrar las instrucciones de instalación para las diferentes plataformas, ademas de ofrecer un script instalador que simplifica este proceso:

Pyenv Installation

y si usamos su script de instalación:

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

NOTA: hay que asegurarnos de una que una vez instalado pyenv tengamos en nuestro archivo: .bashrc o .zshrc o alguno otro dependiendo de nuestra shell, las variables de entorno:

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile

ademas de esto ejecutamos la siguiente linea también:

$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init --path)"\nfi' >> ~/.bash_profile

si es el archivo ".bashrc":

echo -e 'eval "$(pyenv init -)"' >> ~/.bashrc

OSX

La instalación para OSX se recomienda hacer desde brew:

$ brew update 
$ brew install pyenv

de igual forma que en Linux agregamos las variables de entorno a nuestro archivo .bashrc, .zshrc o .bash_profile ya sea el caso.

Siempre hay que leer la documentación de las herramientas que utilizamos.

Trabajando con Pyenv

Una vez instalado podemos comenzar por mostrar el listado de las versiones disponibles para instalar de python:

$ pyenv install --list

y nos mostrará una lista como la siguiente:

Para instalar la versión que necesitemos:

$ pyenv install 3.6.4

y comenzará la instalación, una vez instalado podemos ver las versiones disponibles a usar con el comando:

$ pyenv versions

En la imagen vemos que por default usa la versión de python instalada por mi distro, y vemos la versión que instalé con pyenv, si ejecuto python vemos que es la versión 3.6.4

Definiendo la versión global o localmente

Una vez que tenemos instaladas las versiones con las que trabajaremos podemos definir la versión global (la que se usaría en todo el sistema) o podemos definirla localmente (esta versión puede ser especifica para un directorio o proyecto)

Como veiamos en la imagen anterior por default usa la versión de nuestro SO, en mi caso la 3.6.4

Global
Para definir una versión global ejecutamos el siguiente comando y la versión a usar:

$ pyenv global 3.4.2

vemos que si ejecutamos "pyenv versions" nos muestra con un * la versión de python asignada y si ejecuto el interprete de python muestra la versión instalada con pyenv.

Cuando se define de forma global, no importa el directorio donde estemos, la versión será la asignada.

Local
Para definir una versión local ejecutamos el siguiente comando y la versión a usar:

$ pyenv local 3.4.2

Cuando es definido de forma local, la versión usada será solo valida para el directorio donde lo definimos localmente, esto es útil para un proyecto en especifico y lo definimos en el directorio del proyecto. Por ejemplo:

En la imagen se ve:

En el directorio donde definí la versión local, se crea un archivo de texto oculto llamado ".python-version" y si vemos su contenido este muestra la versión de python local.

Resumen

Pyenv nos permite tener mas de una versión de python en nuestro SO, permitiendo definir diferentes versiones para proyectos incluso ejecutar esas diferentes versiones en paralelo, ademas podemos dejar de lado la versión de nuestro SO y evitamos problemas en las actualizaciones.
En proximos post veremos como combinar pyenv con virtualenv y virtualenvwrapper.