Como manejar las dependencias en python con requirements.txt y PyCharm

Como manejar las dependencias en python con requirements.txt y PyCharm

Las dependencias en un proyecto de python se pueden manejar de muchas maneras. Una de las mas comunes es con el fichero requirements.txt. PyCharm nos ofrece ademas un plugin para sincronizar este fichero cuando hacemos cambios en las librerías que vamos instalando en nuestro proyecto. Veamos como crear este fichero y como utilizarlo.

 

Creación del fichero requirements.txt

En el flujo normal de un proyecto, según vas programando vas incluyendo librerías externas. En el momento que vas a guardar el proyecto en un repositorio es cuando hay que crear el fichero de dependencias. Esto sirve para que cuando otra persona o tu mismo en un futuro descargue el proyecto y empiece a usarlo, con un solo comando o click instale todas las dependencias.

Supongamos que estamos en ese momento antes de guardar, tenemos las dependencias instaladas en nuestro entorno virtual (venv) o en el sistema operativo (opción no recomendada). Para ver un listado de dependencias, abrimos un terminal, el de PyCharm por ejemplo que se abre dentro del venv, y lanzamos el comando pip list o pip3 list.

Es el momento de crear el fichero requirements.txt. Vamos a utilizar el plugin Requirements. Sino lo tenemos instalado, vamos a File -> Settings -> Plugins y lo instalamos. Ahora vamos a Tools -> Sync Python Requirements y nos aparecerá una ventana con unas opciones:

En la primera opción definimos el nombre del fichero y en la segunda podemos establecer que sistema de versiones utilizar.

  • Don’t specify version: esto hace que se instale siempre la ultima de cada librería
  • Strong equality (==): fija una versión
  • Greater or equal (>=): establece una versión mínima
  • Compatible version (~=): Instala la ultima versión compatible. Lo normal es que una major version pueda no ser compatible, pero una minor version o patch version tienen que serlo. Esta opción solo instala estas ultimas versiones. Es para mi la mejor opción

Existen algunas opciones mas a la hora de definir la versión, las podéis ver aquí.

Los 3 siguientes checkbox:

  • Remove unused requirements: por si sincronizamos el fichero mas adelante y hemos dejado de usar una dependencia, se borrar del fichero requirements.txt
  • Modify base files: Esto es para que meta las librerías que tenemos instaladas en el fichero al generarlo
  • Keep existing version: mantiene la versión especificada si coincide con la actual

Con esto ya tendríamos nuestro fichero requirements.txt listo. Me ha ocurrido a veces que hay que hacer esta operación dos veces, la primera crea el fichero y la segunda añade las dependencias.

Esto obviamente también se pude generar con el comando pip y la opción freeze. La única limitación es que te genera la lista con la versión fija, ya que este es un comando para listar lo que hay instalado, no tiene la flexibilidad del plugin.

pip freeze > requirements.txt

 

Instalar dependencias desde el fichero requirements.txt

Cuando nos descargamos un proyecto que tiene el fichero requirements.txt, tenemos varias formas de instalar las dependencias del este fichero:

  • Desde PyCharm: en cuanto abrimos el proyecto desde PyCharm, el propio IDE nos avisa de que faltan paquetes y nos da la opción de instalarlos. También podemos ir al fichero requirements.txt e instalar uno por uno. Ponemos el curso sobre la linea del paquete y pulsamos Alt+Intro para que nos salga el desplegable donde esta esa opción.
  • Desde linea de comandos: nos colocamos en el raíz del proyecto, dentro del venv, si es que tenemos uno configurado, y lanzamos el siguiente comando:
pip install -r requirements.txt

Instalar las dependencias en otro directorio

Si por alguna razón no podemos crear un virtual environment, pero necesitamos tener varios proyectos dentro de una maquina y que las librerías no den conflictos entre ellas, podemos instalar para cada proyecto unas librerías en un directorio personalizado. Esta es una opción que yo no recomiendo para nada, pero hay ocasiones en las que no queda otra. Para hacer esto ya nos olvidamos de plugin, que no soporta esta opción.

Vamos a ver como generar el fichero con las librerías instaladas en la carpeta «lib»:

pip freeze --path=lib > requirements.txt

Ahora vamos a ver como instalar las librerias en la carpeta «lib»:

pip install -r requirements.txt --target=lib

Y ahora como listar estas librerías o ver las que están desactualizadas:

pip list --path=lib
pip list --path=lib --outdated

Si optamos por esta opción, PyCharm nos va a avisar de que las librerías no están instaladas, ya que no las encuentra en el directorio por defecto. Tenemos que añadir el directorio lib a los directorios del interprete. Para ello vamos a File -> Settings -> Project -> Python Interpreter -> Pulsamos en el engranaje que sale a la derecha de Project Interprete -> Show all -> Con nuestro interprete seleccionado, pinchamos en el icono de las carpetas «show paths for the selected interprete» -> y aquí ya añadimos el directorio lib.

Deja una respuesta