Utilizar Python 2 y 3 en la misma máquina

Utilizar las versiones de python 2 y 3 en el mismo equipo en ocasiones puede ser algo muy conveniente. Como ejemplo de ello esta el proyecto de Cross Community CI (XCI) de OPNFV hace uso, entre muchas cosas, del proyecto de OpenStack Bifrost para la creación de una imagen base y provisionamiento de sistema operativo. Este proyecto de Bifrost utiliza el cliente de Ansible en su versión estable 2.1.

Ahora bien, el equipo que utilizo para realizar pruebas y desarrollo tiene instalado ambas versiones de Python y durante la ejecución del cliente de Ansible en su versión 2.1.6 obtengo varios errores. Estos errores son causados por el uso del método unicode que solo se encuentra disponible en versiones 2.x de Python.

Como alternativa para solucionar este problema (sin actualizar o modificar el código fuente del cliente) es forzando al Sistema Operativo a utilizar una versión especifica de Python. La herramienta de pyenv nos permite instalar y trabajar con varias versiones de Python en la misma computadora y su instalación varia de acuerdo al Sistema Operativo utilizado.

En el caso de Sistemas Operativos con Linux su instalación puede realizarse con la siguiente instrucción en la linea de comandos:

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

Para los equipos MacOS, es posible a través del manejador de paquetes brew.

$ brew install pyenv

Esta aplicación utiliza una carpeta para almacenar los binarios de las distintas versiones de Python y los archivos de configuración de los valores del usuario. Como parte de la instalación es necesario declarar la variable de ambiente PYENV_ROOT que especificará la carpeta a ser utilizada. Se recomienda agregar la declaración de esta variable en el PATH para realizarse al momento de cargar la sesión de la consola.

Bash:

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc

Fish:

$ echo "pyenv init - | source" >> ~/.config/fish/config.fish 

Eso nos permite que al iniciar sesión desde cualquier terminal, los valores de configuración sean automáticamente cargados. Las siguientes instrucciones son para la instalación de versiones 2.7.14 y 3.5.4 de Python.

$ pyenv install 2.7.14
Downloading Python-2.7.14.tar.xz...
-> https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tar.xz
Installing Python-2.7.14...
Installed Python-2.7.14 to /Users/vjmorale/.pyenv/versions/2.7.14
$ pyenv install 3.5.4
Downloading Python-3.5.4.tar.xz...
-> https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tar.xz
Installing Python-3.5.4...
Installed Python-3.5.4 to /Users/vjmorale/.pyenv/versions/3.5.4

Por ultimo queda definir la versión activa a lo largo del sistema. Esto se logra por medio del siguiente comando:

$ pyenv global 3.5.4

Nota:
Aunque en mi caso particular pyenv no soluciono mi problema, es posible tener un resultado similar en sistemas Debian a traves del uso update-alternatives.

# update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
update-alternatives: using /usr/bin/python2.7 to provide /usr/bin/python (python) in auto mode
# update-alternatives --install /usr/bin/python python /usr/bin/python3.4 2
update-alternatives: using /usr/bin/python3.4 to provide /usr/bin/python (python) in auto mode
# update-alternatives --config python