Cuando programas en Python es común que hagas uso de muchas librerías y en algún momento necesites una versión muy específica de Python para tu desarrollo. Muchos de estos problemas se pueden solucionar con Docker, sin embargo, no siempre podemos encontrar exactamente lo que buscamos o resulta complicado construirlo si no tenemos una buena base sobre lo que es contenedores.
En algunas distribuciones de Linux es común que tengas instaladas 2 versiones de Python, una de la rama 2.x que por cierto ya va quedando obsoleta y otra versión de la rama 3.x, para descubrir que versión de Python tenemos ejecutamos:
python --version
o
python3 --version
En mi caso estoy corriendo Centos8 y tengo la versión 3.6.8
Pyenv es un programa que nos permite poder instalar distintas versiones de Python y decidir qué versión específica queremos usar en cualquier momento, asi que el primer paso es instalar pyenv, el proceso es bastante sencillo:
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
Con eso se instalará pyenv en tu home directory, ahora tendrás que añadir unas líneas a tu archivo .bashrc que sirven para aumentar una ruta a tu path y activar pyenv cada vez que inicies una nueva sesión.
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
Con estos pasos tendremos pyenv funcionando, puedes verificar la versión instalada ejecutando
pyenv version
Para ver todas las versiones de Python y programas accesorios (anaconda, stackless, miniconda, etc etc) que puedes instalar ejecutas
pyenv install --list | more
Para nuestro ejemplo vamos a instalar una versióm de Python2 y una de Python3, antes de empezar con la instalación hay un paso muy importante que es asegurarse de que tu distribución tiene instalado todo lo necesario para compilar desde fuentes, hablamos de tener gcc, make, etc etc.
Si usas Ubuntu, Debian o derivados ejecuta:
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 python-openssl
Si usas RedHat/Centos/Fedora o derivados ejecuta:
sudo yum groupinstall "Development Tools"
sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite \
sqlite-devel openssl-devel xz xz-devel libffi-devel
Con esto debería ser suficiente para instalar cualquier versión de python, empezaremos con la versión 2.7.9
pyenv install 2.7.9
Una vez que se descargue el código fuente de nuestra versión se compilará en nuestra PC, esto puede tardar un poco dependiendo de la potencia que tengas. Cuando termine puedes verificar que se instalo con el comando
pyenv versions
Eso te mostrará todas las versiones de python instaladas, otra forma de verificar es observando el contenido de nuestro directorio versions en nuestro home directory
ls ~/.pyenv/versions/
Eso significa que para desinstalar alguna versión bastaría con remover el directorio que le corresponde con un rm, pero prefiero usar pyenv para ese propósito
pyenv uninstall 2.7.9
Ahora voy a instalar la última versión de Python disponible, al momento de escribir este post era la versión 3.8.3
pyenv install 3.8.3
Si todo sale bien debes tener como mínimo 2 versiones de Python, en mi caso
$ pyenv versions
* system
2.7.9
3.8.3
El asterisco señala la versión activa de python, en mi caso es la 3.6.8 que viene por defecto en el sistema, para cambiar la versión activa sólo debes ejecutar:
$pyenv global 3.8.3
system
2.7.9
* 3.8.3
Si quieres probar el shell interactivo de alguna versión de python que tengas instalada debes ejecutar:
pyenv shell 2.7.9
Virtual Enviroments
Una vez resuelto el tema de manejar las distintas versiones de Python ahora viene otra parte importante que es manejar los virtual enviroments, hay varias formas de hacerlas, yo recomiendo instalar un plugin de pyenv que sirve especificamente para este propósito: pyenv-virtualenv
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
De forma opcional pero recomendada, ejecutamos el siguiente comando que lo que hace es agregar una línea a tu archivo .bash_profile que hará que tengas el plugin disponible en todo momento.
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
Para crear un entorno virtual que se llame “proyecto1” con la versión 3.8.3 de python ejecutamos
pyenv virtualenv 3.8.3 proyecto1
Si no especificas la versión de Python se creará el entorno con la versión por defecto
pyenv virtualenv proyecto2
Para ver la lista de entornos virtuales ejecutas:
pyenv virtualenvs
Para activar un entorno virtual
pyenv activate proyecto1
Para desactivar un entorno virtual
pyenv deactivate
Para borrar un entorno virtual
pyenv virtualenv-delete proyecto2
¿Bastante fácil verdad?
He cubierto sólo lo básico para empezar, puedes hacer muchas cosas más, espero que te haya sido de utilidad! Happy hacking 🙂