Pipenv - instalación y uso

develop python linux virtualenv osx pipenv pyenv

Continuando con el tema de Python y los entornos de desarrollo, en esta ocasión toca el turno de Pipenv una herramienta que nos facilita el manejo de un entorno aislado para nuestra aplicación, asi como la instalación y el manejo de sus dependencias.

Hemos visto el uso de herramientas como virtualenv y virtualenvwrapper Entornos de desarrollo con Python Virtualenv y como usarlas para crear entornos de proyectos aislados, incluso hemos cubierto otras herramientas como Pyenv
Python & Pyenv - Mas allá de los entornos virtuales
para manejar diferentes instalaciones de python.

Pipenv

Pipenv es una herramienta como lo comenté anteriormente, que nos facilita y une la administracion y manejo de entornos virtuales y sus dependencias.

Pipenv is a tool that aims to bring the best of all packaging worlds (bundler, composer, npm, cargo, yarn, etc.) to the Python world.

Citando de su sitio de documentacion oficial "Pipenv es una herramienta que apunta a traer lo mejor del mundo de la empaquetacion (bundler, composer, npm, cargo, yarn, etc.) al mundo de python."

Escenarios

Para ejemplificar el uso de Pipenv vamos a plasmar un escenario donde creamos un "hola mundo" en flask donde crearemos todo nuestro entorno y veremos como maneja la creación del entorno virtual y las dependencias.

Instalación

Siguiendo la documentación hay diferentes tipos de instalación para los diferentes sistemas operativos:

OSX

Para OSX usaremos brew:

$ brew install pipenv

Linux

Para Linux en la documentación solo mencionan la opción para Fedora:

sudo dnf install pipenv

Para otras distribuciones podemos encontrarlo en repositorios oficiales como Debian y Ubuntu, pero no nos asegura que tengamos la versión mas reciente de esta.

Instalación con Pip

Hay que asegurarnos de tener estos paquetes previamente instalados:

sudo apt-get install python-setuptools python-dev python3-dev
sudo easy_install pip

Podemos instalar la versión mas reciente haciendo uso de pip, y hacer la instalación en un contexto de usuario:

pip install --user pipenv

NOTA: Si hacemos esta instalación tenemos que agregar a nuestra variable de entorno PATH la ruta donde se instala el binaria de pipenv, siendo la ruta "~/.local/bin", podemos agregar esta ruta a nuestro path en el archivo ".bashrc" o ".profile"

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

Despues de instalar basta con hacer un:

source ~/.bashrc

para que tengamos nuestra variable PATH actualizada.

Uso de Pipenv

Una vez instalado comenzamos por crear un directorio para nuestro proyecto:

mkdir -p ~/helloflask

cd ~/helloflask

pipenv install

Mientras instala nos muestra la version de python que utilizaremos, el directorio donde crea el entorno virtual

Y ademas de esto crea dos archivos que son:

Pipfile y Pipfile.lock

Una vez inicializado instalamos lo necesario:

pipenv install flask

una vez instalado flask podemos consultar los paquetes instalados en nuestro entorno virtual usando el clásico "pip list", pero pipenv nos muestra mejor nuestros pquetes instalados, pero antes de esto activamos nuestro entorno usando:

pipenv shell

una vez activado nuestro entorno (nos muestra el nombre del entorno ante puesto a nuestro prompt) ejecutamos:

pipenv graph

Nos muestra como paquete principal Flask en su version 1.0.2
y vemos como sub-dependencias clic, Jinja2 entre otros, asi es mas facil identificar que paquetes son los explicitamente instalados y los que son depedencias de estos.

Y recordando los archivos que creó al iniciar el entorno, "Pipfile y Pipfile.lock" en estos archivos se manejan las dependencias, algo asi como el "requeriments.txt" y como nota: NO DEBEMOS MODIFICARLOS A MANO Pipenv se encargará de modificarlos cuando sea necesario.

Listado de paquetes con pip list

Listado de paquetes con pipenv graph

Una característica muy interesante del archivo Pipfile.lock es que guarda un hash de los paquetes instalados para asegurarnos de la autenticidad de los paquetes que usamos en desarrollo y producción, permitiendonos tener un entorno que se asegura de recrearse fielmente.

Hola mundo Flask

Una vez instalado todo en nuestro en entorno, creamos un archivo de texto con el siguente contenido:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

lo guardamos con el nombre de helloflask.py

y ejecutamos lo siguiente:

export FLASK_APP=helloflask.py
export FLASK_ENV=development
flask run

con esto comenzará a funcionar nuestra aplicacion y podemos verla en el navegador en el puerto 5000

y lo consultamos en nuestro navegador:

presionamos ctrl+c para detener la aplicacion

y para salir de nuestro entorno virtual, ejecutamos:

exit

a comparación de la forma tradicional de desactivar el entorno cuando usabamos virtualenvwrapper ejecutando "deactivate", en Pipenv al activar nuestro entorno se lanza una nueva sesion de nuestra terminal, y para desactivarlo hay que salir de esta sesion, ejecutando "exit" o presionando ctrl+d.

Cuando versionamos nuestro archivo Pipfile y Pipfile.lock al pasar nuestro proyecto a otro equipo o entorno, basta con ejecutar "pipenv install" y leerá nuestro archivo de dependencias Pipfile e instalará las dependencias necesarias para el proyecto.

Resumen

Al final Pipenv reune en una sola herramienta muchas de las herramientas que utilizamos ademas de permitirnos manejar de una mejor manera nuestras dependencias del proyecto. En siguientes articulos describiré el flujo de trabajo combinando Pyenv + Pipenv y Pipsi, para tener un entorno de desarrollo y producción.