Python workflow

develop python linux virtualenv pipenv pyenv debian

En posts anteriores hemos visto el uso e instalación de herramientas como virtualenvwrapper, pyenv y pipenv, hemos visto las ventajas de usar estas herramientas en nuestro entorno de desarrollo, y quiero compartir el flujo de trabajo que personalmente uso, combinando algunas de estas herramientas.

Escenario

Todo este flujo de trabajo lo realizare en un entorno de trabajo bajo docker, con base de una imagen de Debian 9 Stretch, obviaré la instalación y creación del contenedor, esto lo podemos ver en otro post.

Paso 1 - Instalar Pyenv

Lo primero que haré será instalar Pyenv, esto para utilizar una versión de python más reciente que la default de nuestro SO y para evitar posibles problemas si se actualizara la versión de python de nuestro SO

Pero a diferencia de como lo hicimos en el post de Pyenv, usando el script instalador, usaré el método de git de instalación de pyenv:

Nota: como lo podemos leer en la wiki de pyenv pyenv-github para la instalación de python con pyenv necesitamos algunos paquetes previamente instalados:
Debian/Mint/Ubuntu

sudo apt-get update; sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
git clone https://github.com/pyenv/pyenv.git ~/.pyenv

Clonamos el proyecto de pyenv en nuestro directorio $HOME/.pyenv

Y añadimos las siguientes líneas a nuestro archivo .bashrc si usamos bash o .zshrc si usamos Zshell

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 --path)"\nfi' >> ~/.bashrc

Recargamos nuestro interprete:

exec "$SHELL"

E instalamos nuestra versión de python a utilizar:

pyenv install 2.7.15

Si ocurriera algún error durante la instalación, recomiendo revisar la wiki de pyenv para consultar los errores mas comunes

Una vez instalado definimos globalmente la versión de python que instalamos:

pyenv global 2.7.15

Revisamos que nuestra versión es la que instalamos previamente, y estamos listos para continuar.

Paso 2 - Instalar Pipenv

Una vez definida nuestra versión de python, usaremos pipenv como vimos en post anterior, pipenv además de manejar nuestros entornos virtuales, nos permite administrar de una mejor forma nuestras dependencias de proyectos, reemplazando el uso de pip install y el archivo requeriments.txt

Instalamos pipenv:

pip install --user pipenv

Si nos muestra una advertencia como la siguiente:

The script virtualenv-clone is installed in '/home/developer/.local/bin' which is not on PATH.

agregaremos a nuestro PATH la ruta que muestra el mensaje:

echo -e 'export PATH="$PATH:/home/developer/.local/bin"' >> ~/.bashrc

y recargamos nuestro interprete:

exec "$SHELL"

Paso 3 - Creando un entorno virtual y manejando sus dependencias

Una vez instalado pyenv y pipenv, podemos comenzar a crear nuestros entornos virtuales, o bien podemos migrar algun proyecto en el que previamente usabamos pip y el archivo requeriments.txt al uso de Pipfile y Pipfile.lock

Primer caso - Creando un entorno virtual nuevo para un proyecto nuevo

Creamos un directorio donde iniciaremos nuestro proyecto:

mkdir helloflask
 cd helloflask
 pipenv install --python 2.7.15

Iniciamos nuestro entorno virtual:

pipenv shell

vemos como se antepone a nuestro prompt el nombre del entorno virtual conformado por el nombre del directorio de nuestro proyecto seguido de un identificador único, ademas de crearse los archivos Pipfile y Pipfile.lock que es el reemplazo mejorado del archivo requeriments.txt

y para este ejemplo instalamos flask:

pipenv install flask

y si vemos el contenido de nuestro archivo Pipfile y Pipfile.lock vemos que se actualizó con flask y sus dependencias, también podemos utilizar el comando pipenv graph para ver nuestros paquete y dependencias instalados en nuestro entorno virtual:

Segundo caso - Creando un entorno virtual nuevo para un proyecto existente

En este caso tomaremos como ejemplo un proyecto previamente creado y que tiene un archivo requeriments.txt y que migraremos al uso de Pipfile.

cd ~/flaskapi
 pipenv install --python 2.7.15 -r requeriments.txt

En este caso el archivo requeriments.txt contiene flask y BeatifulSoup4
pipenv tomará este archivo requeriments.txt e instalará su contenido y actualizará los archivos Pipfile y creará el entorno virtual, si analizamos el uso de los archivos Pipfile evitamos el tener que hacer el uso de pip freeze y de tener que especificar que librerías tomar en cuenta.

Y hasta aquí llega el flujo de trabajo normal que tengo al usar python y estas herramientas, vemos que hay un sin fin de opciones y herramientas para el manejo de entornos virtuales, versiones de python, etc. Pero con estas dos herramientas podemos abarcar todo en uno, simplificando el flujo de trabajo.