Dependencias en Python: The Right Way

6 de mayo de 2024 por
Héctor Romero López
| Sin comentarios aún

Python es un lenguaje muy accesible por cualquier persona, ¿Por qué? Debido a su sencillez, su curva de aprendizaje es muy pequeña. Siempre surge el argumento "Python es como hablar inglés", sin embargo, el otro motivo, es porque nos permite hacer muchas cosas debido a su versatilidad  y a la gran cantidad de librerías de las que disponemos.

Python nos permite hacer desde scripts para tareas sencillas, como trabajar con un fichero txt, hasta aplicaciones web completas, utilizando Django o FastApi para realizar una estructura de microservicios. La posibilidad de realizar todas estas funciones nos las dan las librerías.

¿Qué son las librerías en Python?

Las librerías, dentro de Python, nos permiten reutilizar gran cantidad de código. Hablando de forma sencilla, es código que han realizado otras personas, las cuales las han empaquetado de forma que el resto de desarrolladores podamos utilizaras e instalarlas de forma sencilla.

Para poder usar cualquier librería, tenemos la opción de descargar los ficheros e introducirlos dentro de las carpetas (tarea tediosa cuanto menos) o podemos utilizar un gestor de paquetes, como puede ser Pip 

Podemos instalar "cualquier librería" de forma muy sencilla . Simplemente ejecutamos:

pip install django

Y ya tendríamos Django instalado para comenzar con nuestro desarrollo web. ¿Fácil verdad?

Ya que hemos comenzado a entrar en materia de dependencias en Python, es clave, fundamental, esencial y todos los adjetivos que indiquen necesidad y obligación habidos y por haber, el tener un fichero requirements.txt dentro de nuestro proyecto.

El fichero de requirements, describe todas las dependencias del proyecto con sus respectivas versiones. Más que esencial para permitir a cualquier persona trabajar en un proyecto o realizar el despliegue de forma sencilla. Para obtenerlo simplemente tenemos que ejecutar el comando:

pip freeze > requirements.txt

Obteniendo como resultado un fichero como el siguiente: 


En este caso, nuestro fichero solo tiene una dependencia (que instalaremos más adelante), sin embargo, este fichero puede ser más extenso y complejo como el que se puede ver aquí.

 ¿Dónde esta el problema?

Al instalar las librerías, todas van al mismo lugar (generalmente /usr/lib/python) este hecho causa varios problemas a la larga.

Actualizaciones

El primer problema surge del hecho que tarde o temprano tendremos que actualizar las versiones de las librerías, si nunca actualizásemos nada, todos los programas utilizarán las mismas versiones y librerías nunca habría problema. Claro, eso es el  mundo ideal. Pero la realidad es que cuando trabajamos a lo largo del tiempo, requerimos actualizaciones de las librerías y que cuando estamos trabajando con diferentes programas cada uno requiere una versión concreta, de lo contrario, no funcionará.

Residuos

Otro de los problemas que tenemos, es el hecho de que nunca borramos nada. Es muy común probar alguna librería (o instalar una dependencia para X programa) descubrir que no la necesitamos y no borrarla.

El problema es que tenemos "basura" que no sirve dentro de nuestro sistema. A la larga, tendremos problemas de incompatibilidades cuando tengamos que instalar algo que de verdad sea útil. Obviamos todos los problemas de seguridad que pueden existir a raíz de tener elementos en nuestro sistema que desconocemos y no actualizamos.


Instala lo que necesitas donde lo necesitas

Entendiendo el origen del problema y el problema en sí. Vamos a ponerle solución. La solución es bastante simple: "Instalamos lo que necesitamos dentro de cada proyecto de forma aislada" dicho de forma más natural. Cuando estemos trabajando en un proyecto donde tengamos que instalar alguna librería de Django, sería en ese proyecto donde lo instalemos independiente del resto de nuestro entorno global. Finalizamos el proyecto, eliminamos todas las dependencias, de forma aislada.

Esto suena un poco complicado, pero tenemos muchas herramientas que nos facilitan la vida: pypenv, conda y virtualenv por mencionar algunas. Mi favorita (al menos con la que trabajo diariamente es virtualenv) la cual veremos su uso de forma muy sencilla en el resto del blog.

Aislando dependencias por proyectos

Para poder aislar las dependencias de nuestros proyectos, vamos a crear una copia de los binarios de Python con los que queremos trabajar en nuestro proyecto en una carpeta aislada, serán esos binarios los que utilicemos para trabajar hasta que finalicemos dicho proyecto. Este mecanismo es como funciona el entorno virtual​. 

Para poder realizar todo este complejo proceso, simplemente tenemos que ejecutar el comando

virtualenv -p python3 venv

De forma muy resumida, esto nos generará nuestros ficheros de entorno virtual dentro de la carpeta venv. Visualizando rápidamente la carpeta podemos ver que tenemos:

  • Carpeta bin: La cual contiene los binarios de Python, además de unos scripts activate para poder utilizar el entorno virtual de una forma más sencilla
  • lib: La cual contendrá todas las librerías que instalemos haciendo uso del entorno virtual
  • pyvenv.cfg: Fichero que configuraci´ón del propio entorno virtual
Ejemplo de uso

Imaginemos que queremos instalar una librería como Pillow (utilizada para el tratamiento de imágenes) en nuestro entorno virtual. Tenemos que ejecutar la herramienta pip ubicada dentro de venv/bin/pip 

./venv/bin/pip install Pillow

El resultado no difiere nada, simplemente se instalará como si no estuviera el entorno virtual funcionando, pero podemos ver el contenido de la carpeta venv/lib y veremos que tenemos todos los ficheros de la librería:


Vemos que en la carpeta de lib, concretamente en la versión con la que trabajamos (3.11) tenemos nuestra librería recién instalada. 

Activando el entorno virtual

La forma de instalar esta dependencia es un poco tediosa y confusa, puesto que siempre tenemos que acceder a la carpeta del entorno virtual. Cuando hacemos which pip, obtenemos como resultado el ejecutable de nuestro sistema, en lugar de nuestro entorno virtual.

Para solucionar esto, simplemente recurrimos al script de activación del entorno virtual, el cual nos actualizará todos los enlaces de Python y Pip al entorno virtual que hemos creado. 

A partir de este momento, cualquier librería que instalemos y cualquier script que ejecutemos lo estaremos haciendo desde entorno virtual.

¿Cómo trabajaremos?

A partir de este momento, podremos instalar todo lo que necesitemos sin ningún tipo de problema y conflicto. Cuando desechemos el proyecto o encontremos algún problema, simplemente tenemos que eliminar el entorno virtual e instalar simplemente lo que necesitemos.

Concluyendo vemos que es necesario tener las dependencias aisladas entre proyectos por los numerosos problemas que pueden causar. Afortunadamente, en Python, tenemos numerosas herramientas, de las cuales los entornos virtuales (venv) son una forma muy sencilla de gestionar las dependencias dentro de nuestros proyectos para evitar problemas.

Héctor Romero López 6 de mayo de 2024
Compartir
Categorías
Nuestros blogs
Archivar
Identificarse dejar un comentario