Tag: python

Pyenv para tener distintas versiones de Python

Python 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 🙂

Instalar psycopg2 en FreeBSD

Me ví­ en la situación de tener que trabajar con Postgres sobre FreeBSD y necesitaba un script para jalar datos de unas bases de datos en formato DBF (si, DBF pueden creerlo?) fue asi que encontre un script llamado dbf2pgsql que fue hecho por Hiroo Imaki.

Luego de descargarlo, lo modifiqué un poco para que se adaptara a mis necesidades y cuando lo ejecuté encontré un problema, me hacia falta la librerí­a psycopg2 que es un magní­fica librerí­a que permite la interacción entre Python y Postgres, el problema es que por lo visto da muchos problemas para poder ser instalado.

El primer requisito para poder instalar psycopg2 es tener instalado Setuptools luego de instalarlo trate de instalar pysopg2

python setup.py build

No lo pude hacer porque tení­a el siguiente error
error: static declaration of ‘round’ follows non-static declaration

Luego de mucho buscar por una solución me encontré con este post de Reed Obrien
http://reedobrien.blogspot.com/2008/02/error-building-psycopg-custom-egg.html

Por lo visto es un error para poder hacer el build en FreeBSD, solucion pasa por editar el archivo config.h y comentar las siguientes lí­neas:

#if defined(__FreeBSD__) || (defined(_WIN32) && !defined(__GNUC__)) || defined(__sun__) || defined(sun)
/* what's this, we have no round function either? */
/*
static double round(double num)
{
  return (num >= 0) ? floor(num + 0.5) : ceil(num - 0.5);
}
*/
#endif

Luego de esto cruce los dedos:

python setup.py build

Bingo! funcionó sin problemas, y ahora el paso final

python setup.py install

Y ahora ya pude correr con éxito el script dbf2pgsql, tardé mucho en dar con la respuesta, asi que espero que esto pueda ser útil.

Conferencias: Dynamic Programming Day 2008

Si eres desarrollador web y planeas dedicarte en serio a la programación para web te recomiendo firmemente que acudas a las conferencias Dynamic Programming Day 2008 organizadas por el Grupo de Usuarios de Linux del Perú
Dynamic Programming Day 2008

La entrada es completamente gratuita y ademas se van a regalar CDs con códigos fuentes, ví­deos y documentación. Se hablará de todos los lenguajes de “moda” y sobre las últimas tendencias en programación web. Asi que ya saben no se la pierdan 😉

Mas información con el programa y los detalles en la página del evento: http://www.linux.org.pe/dpd08/