Utilizar Python 2.x y 3.x en la misma máquina

Actualmente me encuentro explorando el proyecto de Cross Community CI (XCI) de OPNFV que hace uso, entre otras cosas, del proyecto de OpenStack Bifrost para la creación de una imagen base y provisionamiento de la misma. En este momento el proyecto de Bifrost utiliza el cliente de Ansible en su versión estable 2.1. El equipo que utilizo tiene instalado ambas versiones de Python, pero varios errores son arrojados durante la ejecución del cliente de Ansible en su versión 2.1.6, para ser mas específicos, los 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 es posible forzar al Sistema Operativo a utilizar una versión de Python. La herramienta de pyenv 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

Y para los equipos con Mac OS, es posible a través del manejador de paquetes brew.

$ brew install pyenv

Dado que esta aplicación utiliza una carpeta para almacenar los binarios de las distintas versiones de Python y guardar los valores de usuario seleccionados es necesario definir la variable de ambiente PYENV_ROOT que especificará la carpeta a ser utilizada. Esta variable y la adición del binario en la variable PATH debe 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 

Al iniciar la terminal los valores serán cargados y podremos hacer uso de los comandos, como lo es 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 solo queda definir que versión quedara activa a lo largo del sistema. Esto se logra por medio del siguiente comando

$ pyenv global 3.5.4

Nota:
Aunque en mi caso no soluciono mi problema en particular, parece que 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

Leave a Reply