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.
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 python3-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.
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.
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.
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.