Python » Python Avanzado » Gestión de dependencias en Python con pip

Gestión de dependencias en Python con pip

Un tema que todo desarrollador Python debe aprender tarde o temprano es saber gestionar correctamente las dependencias de sus programas. Para ello Python nos proporciona la herramienta pip, y en este artículo te voy a explicar todo lo que considero esencial de saber sobre esta herramienta.

¿En qué consiste la gestión de dependencias?

En Python, tanto programas grandes como scripts se suelen desarrollar apoyándose en librerías y/o frameworks de terceros a los cuales llamamos dependencias. A su vez estas dependencias pueden tener otras dependencias llamadas dependencias transitivas. Esto sucede, por ejemplo, con pandas. Pandas es una librería muy popular pensada para manipular y analizar datos, cuyo desarrollo está basado en NumPy, otra librería muy conocida para realizar cálculos matriciales. Por tanto, al utilizar pandas también utilizamos, aunque de forma indirecta, NumPy.

Gestionar todas las dependencias de un programa grande de forma manual puede llegar a ser un proceso tedioso. Por un lado requiere dedicarle tiempo y por otro se trata de un proceso en el cual es fácil realizar fallos. La solución a estos inconvenientes son los llamados sistemas de gestión de paquetes.

Antes de continuar, puntualizar que en Python cuando decimos “paquetes” solemos referirnos a librerías y frameworks de terceros. Algunos ejemplos muy conocidos son, por ejemplo, Django para el desarrollo web, o Requests para realizar peticiones HTTP.

Python tiene su propio sistema de gestión de paquetes llamado pip. Esta aplicación es en realidad una interfaz de línea de comandos que viene preinstalada con cualquier versión moderna de Python.

Para saber si lo tenemos instalado es tan sencillo como ejecutar el siguiente comando en nuestro terminal.

$ pip --version

En caso que así sea, nos informará sobre la versión de pip que tenemos instalada. En la siguiente imagen podemos ver que en mi computadora tengo instalada la versión 20.3.4 de pip, la cual es ejecutada por Python 3.9.

Comando pip --version

Adicionalmente, también podemos ver un listado de todos los argumentos admitidos por pip mediante el siguiente comando.

$ pip --help

Instalar y actualizar pip

Instalación

Como he comentado en el apartado anterior, pip está incluido por defecto en versiones modernas de Python. En concreto se introdujo a partir de Python 2.7.9 en adelante (en Python 2) y a partir de Python 3.4 en adelante (en Python 3). Si tu versión de Python es anterior a las mencionadas existen dos alternativas para poder instalarlo. La primera, aunque sea un poco obvia hay que mencionarla, y es que actualices a una versión de Python más moderna. Si por el motivo que sea esto no fuera posible, alternativamente puedes añadir pip a tu instalación de Python, pero ten en cuenta que a partir de pip 21.0 se eliminó el soporte para Python 2.

En Windows o macOS, para añadir pip a la instalación de Python, primero tienes que descargar el script de instalación de pip. Luego, ejecutarlo como cualquier otro script.

$ python get-pip.py

En distribuciones de Linux (Debian/Ubuntu) el proceso varía un poco ya que hay que usar su sistema de gestión de paquetes.

$ sudo apt update
$ sudo apt install python-pip

Actualización

El proceso de actualización de pip varía en función de tu sistema operativo. En Windows y macOS se utiliza directamente el comando pip, mientras que en Linux la actualización se realiza con el sistema de gestión de paquetes. A continuación te detallo como actualizar pip para cada uno de esto tres sistemas operativos.

  • Windows
C:\>pip install --upgrade pip setuptools
  • macOS
$ python -m pip install --upgrade pip
  • Linux
$ sudo apt update && sudo apt upgrade python-pip

Repositorios de paquetes de Python

El repositorio oficial (y más grande) de paquetes de Python es el Python Package Index (PyPI). Cualquier programador puede registrarse gratuitamente en PyPI y subir ahí sus propios paquetes. Una vez que un paquete aparece en PyPI, cualquier persona puede instalarlo localmente mediante pip. Pero como no hay ningún proceso de revisión ni de aseguramiento de la calidad, es recomendado invertir algo de tiempo en revisar el software que estamos adquiriendo.

En PyPI podemos realizar búsquedas de paquetes por nombre y/o filtrar resultados en función de ciertos criterios como el estado de desarrollo, la licencia, etc. Además, cada paquete tiene su propia página en la web de PyPI. Ahí podemos obtener mucha información sobre un paquete en cuestión: la versión, la licencia, el comando para instalarlo, el nombre del autor, las versiones de Python con las que se ha testeado el paquete, y mucho más. Para que te hagas una idea de ello puedes consultar la página de Requests en PyPI.

Instalar dependencias con pip

Para instalar con pip cualquier paquete disponible en PyPI, simplemente debes teclear el siguiente comando:

$ pip install nombre

Donde nombre es el nombre del paquete deseado. La herramienta pip no sólo instalará el paquete que le indicamos y su dependencias, sino que además los almacenará en una caché local de caras a futuras instalaciones.

Otro comando útil, complementario al de instalar, es el que nos muestra un listado de los paquetes instalados que es el siguiente:

$ pip list

En la siguiente captura del terminal podemos ver cómo hemos combinado ambos comandos. Primero, listando los paquetes de Python que tenemos instalados. Segundo, instalado la librería Requests junto con todas sus dependencias. Finalmente, confirmando dicha instalación en el listado de paquetes instalados.

Listado e instalación de paquetes con pip

Una consideración a tener en cuenta es que pip instala por defecto los paquetes en el entorno global de Python. Sin embargo, es recomendado instalar nuestras dependencias en entornos virtuales de Python, ya que de este modo mantenemos las dependencias separadas por proyectos y evitamos posibles conflictos entre versiones de una misma dependencia.

Instalación de versiones anteriores

Por defecto pip instala la última versión disponible de un paquete. Sin embargo, también es posible instalar versiones específicas. Para ello tenemos que especificar la versión deseada como se muestra a continuación, donde instalamos la versión 2.23.0 de la librería Requests:

$ pip install requests==2.23.0

Otra posibilidad es instalar versiones que supongan actualizaciones menores de una versión específica para, por ejemplo, aprovechar la corrección de un bug. El siguiente comando instala la versión 2.18.4 de la librería Requests, que es la más reciente de las versiones 2.18.X.

$ pip install requests~=2.18.0

Instalación desde GitHub

Aunque lo más recomendado es instalar las dependencias directamente desde PyPI, también lo podemos hacer desde sus repositorios en GitHub. Para ello basta con ejecutar un comando tal que así:

$ pip install git+https://github.com/usuario/repositorio.git@rama

De este modo, podemos instalar la versión de la rama máster de Requests con el siguiente comando:

$ pip install git+https://github.com/kennethreitz/requests.git@master

Además, también podemos instalar commits o versiones específicas indicando respectivamente el hash o el número de versión.

Obtener información de un paquete instalado

Una vez hemos instalado un paquete en nuestro entorno de Python, podemos obtener información adicional sobre el mismo en nuestro terminal. Para ello tenemos que ejecutar el siguiente comando:

$ pip show nombre

En la siguiente captura del terminal podemos ver toda la información que nos proporciona este comando.

Información de una librería en el terminal

Identificar y actualizar dependencias obsoletas

Con el tiempo, las librerías que tenemos instaladas en nuestro entorno van recibiendo actualizaciones y se quedan obsoletas. Para ver un listado de las librerías que disponen de una nueva versión puedes ejecutar el siguiente comando:

$ pip list --outdated

Como vemos en la siguiente imagen, el comando anterior nos informa de la versión que tenemos instalada y el número de la última versión disponible.

Listar paquetes obsoletos con pip

Para actualizar una librería en particular a su última versión hay que ejecutar el siguiente comando, sustituyendo nombre por el nombre de la librería en cuestión:

$ pip install --upgrade nombre

Desinstalar dependencias

En algunas ocasiones instalamos una librería simplemente para probarla. Si queremos desinstalarla de nuestro entorno, es tan sencillo como ejecutar el siguiente comando:

$ pip uninstall nombre

Hemos de tener en cuenta que este comando no desinstala las posibles dependencias transitivas. Por eso son tan útiles los entornos virtuales, ya que nos permiten eliminar todas las dependencias de golpe eliminando la carpeta del entorno virtual.

Conclusiones

En este artículo hemos visto a fondo todo lo que concierne a la gestión de dependencias en Python con pip. Desde cómo instalar y actualizar esta herramienta, a cómo utilizarla para instalar, listar, actualizar y eliminar las dependencias que vamos a utilizar para desarrollar nuestros programas o scripts en Python. Otro aspecto que hemos visto es la importancia de combinar pip con entornos virtuales para mantener nuestro entorno global de Python limpio, y poder evitar posibles conflictos entre versiones. En otro post ya hemos tratado la gestión de entornos virtuales en Python, el cual te invito a leer si te interesa profundizar sobre este tema.

Para finalizar me gustaría hacerte la siguiente pregunta: ¿utilizas frecuentemente algún otro comando de pip? De ser así me encantaría que me lo hicieras saber en los comentarios.


Suscríbete al blog y recibe gratis esta guía que he preparado para ti.
¿Dónde te envío la guía?
Responsable: Albert Brugués. Finalidad: envío de publicaciones y correos comerciales. Legitimación: tu consentimiento. Destinatarios: MailChimp. Leer la política de privacidad de MailChimp.
Foto del autor

Albert Brugués

Soy doctor en informática médica y un apasionado de la tecnología y las nuevas oportunidades que brinda. Más en particular me encanta la inteligencia artificial y el desarrollo web. En este blog pretendo compartir los conocimientos de Python que he ido adquiriendo a lo largo de los años.

Deja un comentario