Cómo utilizar entornos virtuales y `requirements.txt` en Python

Al desarrollar en Python, la gestión del entorno y las dependencias es muy importante. Para manejar de manera segura diferentes bibliotecas y versiones por proyecto, lo mejor es utilizar un entorno virtual. Además, al usar requirements.txt, se pueden compartir y reproducir fácilmente los paquetes necesarios. En este artículo, explicaremos en detalle desde lo básico hasta lo avanzado sobre los entornos virtuales y requirements.txt, y cómo gestionar eficientemente los proyectos de Python.

Índice

Resumen y necesidad de los entornos virtuales


Un entorno virtual es un entorno que permite gestionar paquetes y configuraciones de manera independiente para cada proyecto de Python. Si se instalan bibliotecas directamente en el entorno global de Python, puede haber conflictos de dependencias con otros proyectos.

Funciones de un entorno virtual


El entorno virtual cumple con las siguientes funciones:

  • Aislamiento de dependencias: Puedes gestionar de forma individual las bibliotecas y sus versiones necesarias para cada proyecto.
  • Reproducibilidad del entorno: Puedes crear fácilmente el mismo entorno en diferentes máquinas.
  • Protección del entorno global: Puedes continuar el desarrollo sin afectar al entorno global de Python del sistema.

Por qué necesitas un entorno virtual


Si no utilizas un entorno virtual, puedes enfrentar los siguientes problemas:

  • Conflictos cuando diferentes proyectos necesitan distintas versiones de la misma biblioteca.
  • Instalación de bibliotecas innecesarias en el entorno global, lo que puede generar desorden en el sistema.
  • Reducción de la portabilidad del proyecto y la posibilidad de que no funcione en otras máquinas.

Usar entornos virtuales resuelve estos problemas y hace el desarrollo en Python más eficiente.

Pasos para crear un entorno virtual en Python


Si usas el módulo estándar de Python, venv, puedes crear un entorno virtual de manera muy sencilla. A continuación, explicamos los pasos para hacerlo.

1. Prepara el directorio donde crearás el entorno virtual


Primero, elige la carpeta del proyecto donde crearás el entorno virtual y navega a esa carpeta en la terminal o símbolo del sistema.

cd /path/to/your/project

2. Crear el entorno virtual


Ejecuta el siguiente comando para crear el entorno virtual. El nombre del entorno virtual es opcional, pero comúnmente se usa venv.

python -m venv venv
  • Este comando crea una carpeta llamada venv en el directorio actual. Todos los datos del entorno virtual se guardarán dentro de esta carpeta.

3. Verifica la estructura del directorio creado


La carpeta del entorno virtual tendrá la siguiente estructura:

  • bin (o Scripts): Carpeta que contiene los archivos ejecutables.
  • lib: Carpeta donde se guardan los paquetes instalados dentro del entorno virtual.
  • pyvenv.cfg: Archivo de configuración del entorno virtual.

Consideraciones importantes

  • Si tienes varias versiones de Python, puedes especificar una versión específica para crear el entorno virtual:
  python3.10 -m venv venv
  • Si el módulo venv no está instalado, necesitarás reinstalar Python e incluir venv.

Una vez creado el entorno virtual, el siguiente paso es activarlo y desactivarlo. A continuación, te mostramos cómo hacerlo.

Cómo activar y desactivar el entorno virtual


Después de crear el entorno virtual, activarlo te permitirá usar Python y los paquetes instalados en ese entorno. Cuando termines de trabajar, puedes desactivarlo. A continuación, explicamos cómo hacerlo según el sistema operativo.

1. Activar el entorno virtual


El comando para activar el entorno virtual varía según el sistema operativo.

En Windows


Si usas el símbolo del sistema:

.\venv\Scripts\activate

Si usas PowerShell:

.\venv\Scripts\Activate.ps1

En macOS o Linux


Ejecuta el siguiente comando en la terminal:

source venv/bin/activate

Verificación de la activación del entorno virtual


Si la activación fue exitosa, verás el nombre del entorno virtual al principio del prompt (por ejemplo, (venv)).

(venv) user@machine:~/project$

2. Desactivar el entorno virtual


Para desactivar el entorno virtual, utiliza el siguiente comando:

deactivate

Una vez desactivado, el nombre del entorno virtual desaparecerá del prompt y volverás al entorno global.

Consideraciones importantes

  • Si instalas paquetes sin activar el entorno virtual, podrían instalarse en el entorno global.
  • La desactivación solo funciona si estás en la misma terminal en la que activaste el entorno.

Al activar y desactivar correctamente el entorno, puedes usarlo de manera segura y eficiente.

Creación de `requirements.txt` usando `pip freeze`


requirements.txt es un archivo que lista las bibliotecas de Python necesarias para un proyecto y es útil para crear entornos de desarrollo reproducibles. A continuación, explicamos cómo generar un archivo requirements.txt utilizando pip freeze.

1. Activar el entorno virtual


Primero, activa el entorno virtual. Solo se registrarán las bibliotecas instaladas en el entorno virtual.

2. Instalar las bibliotecas necesarias


Instala los paquetes necesarios para tu proyecto. Por ejemplo, puedes instalar lo siguiente:

pip install numpy pandas flask

3. Usar `pip freeze` para ver las dependencias actuales


Para ver todos los paquetes instalados y sus versiones en el entorno virtual, ejecuta el siguiente comando:

pip freeze

Ejemplo de salida:

flask==2.3.2
numpy==1.24.3
pandas==2.1.1

4. Crear `requirements.txt`


Para guardar la salida de pip freeze en requirements.txt, usa el siguiente comando:

pip freeze > requirements.txt

Este comando guardará todos los paquetes instalados en el archivo requirements.txt.

5. Verificar el archivo `requirements.txt`


Al revisar el archivo requirements.txt, verás que las bibliotecas y sus versiones están registradas como sigue:

flask==2.3.2
numpy==1.24.3
pandas==2.1.1

Consideraciones importantes

  • Para evitar incluir bibliotecas innecesarias, trabaja solo dentro del entorno virtual.
  • Si es necesario, puedes editar manualmente requirements.txt para eliminar paquetes no deseados.

Ahora, con el archivo requirements.txt puedes compartir fácilmente las dependencias del proyecto y reproducir el entorno en otros sistemas.

Instalar paquetes desde `requirements.txt`


requirements.txt se usa para instalar rápidamente todas las bibliotecas necesarias para un proyecto. En esta sección, explicamos cómo utilizar requirements.txt para instalar todos los paquetes en un entorno virtual.

1. Activar el entorno virtual


Activa el entorno virtual en el que deseas instalar los paquetes. Si no lo activas, los paquetes podrían instalarse en el entorno global.

source venv/bin/activate  # Para macOS/Linux
.\venv\Scripts\activate   # Para Windows

2. Instalar paquetes desde `requirements.txt`


Usa el siguiente comando para instalar todos los paquetes listados en requirements.txt:

pip install -r requirements.txt

Detalles de la instalación

  • El comando lee requirements.txt e instala cada paquete listado en el archivo.
  • Si se especifica una versión de paquete, se instalará esa versión exacta.
flask==2.3.2
numpy==1.24.3
pandas==2.1.1

Los tres paquetes anteriores se instalarán con las versiones especificadas.

3. Verificar la instalación


Para verificar que los paquetes se instalaron correctamente, usa el siguiente comando para ver la lista de paquetes instalados:

pip list

4. Solución de problemas


Si se producen problemas durante la instalación, revisa lo siguiente:

  • Conexión a Internet: Asegúrate de tener acceso a Internet para descargar los paquetes.
  • Paquete y versión: Verifica que el paquete y su versión sean correctos.
  • Permisos: Asegúrate de que el entorno virtual esté correctamente activado.

Consideraciones importantes

  • Para evitar usar versiones de paquetes antiguas o desactualizadas, puedes usar el comando --no-cache-dir:

  pip install -r requirements.txt --no-cache-dir

Al utilizar requirements.txt, puedes gestionar dependencias complejas fácilmente y configurar entornos de manera consistente.

Mejores prácticas para aumentar la reproducibilidad del proyecto

Usar entornos virtuales y requirements.txt mejora la reproducibilidad y mantenibilidad de los proyectos de Python. A continuación, te presentamos algunas mejores prácticas para gestionar de manera eficiente el entorno de desarrollo.

1. Crear un entorno virtual para cada proyecto

Al crear un entorno virtual independiente para cada proyecto, puedes evitar conflictos de dependencias. Asegúrate de:

    • Usar la misma versión de Python para el proyecto.

    • Colocar la carpeta del entorno virtual (por ejemplo, venv) en la raíz del proyecto.

Ejemplo de estructura recomendada de directorios

my_project/
├── venv/
├── src/
├── requirements.txt
└── README.md

2. Actualiza regularmente el archivo `requirements.txt`

Cada vez que instales una nueva biblioteca o cambies la versión de una existente, actualiza requirements.txt:

pip freeze > requirements.txt

Esta práctica garantiza que todos los desarrolladores trabajen con el mismo entorno.

3. Especifica versiones claras

Cuando agregues bibliotecas a requirements.txt, especifica versiones claras siempre que sea posible. Ejemplo:

numpy==1.24.3
flask>=2.3,<2.4

    • Fijar la versión garantiza que el proyecto funcione de manera consistente en diferentes entornos.

    • Si defines un rango de versiones, asegúrate de que sean compatibles.

4. Separa las bibliotecas de desarrollo y de producción

Si solo necesitas bibliotecas para el desarrollo (por ejemplo, herramientas de depuración o bibliotecas de prueba), guárdalas en un archivo separado. Ejemplo:

    • requirements.txt (para producción)

    • dev-requirements.txt (para desarrollo)

Para instalar los paquetes adecuados, usa el comando correspondiente:

pip install -r dev-requirements.txt

5. No incluyas el entorno virtual en el control de versiones

Agrega el directorio del entorno virtual (por ejemplo, venv) a .gitignore para excluirlo del control de versiones. Ejemplo:

venv/

De esta forma, evitarás incluir archivos innecesarios en el repositorio.

6. Usa `requirements.txt` en la integración continua (CI/CD)

En un entorno de integración continua (CI) o despliegue, utiliza requirements.txt para asegurar la coherencia del entorno:

pip install -r requirements.txt

Incluir este paso en herramientas de CI (por ejemplo, GitHub Actions o Jenkins) facilita la ejecución de pruebas automáticas y despliegues.

7. Verifica la seguridad de los paquetes

Usa herramientas como pip-audit o safety para comprobar regularmente si hay vulnerabilidades de seguridad en las dependencias:

pip install pip-audit
pip-audit

Al seguir estas mejores prácticas, mejorarás la reproducibilidad de tu proyecto y facilitarás la colaboración con otros desarrolladores o equipos.

Resolución de problemas y solución de incidencias

Al usar entornos virtuales y requirements.txt, pueden surgir problemas. Aquí se explican los problemas comunes y sus soluciones.

1. No puedo activar el entorno virtual

Detalles del problema

Si intentas activar el entorno virtual y ves un mensaje de error como:

    • Windows PowerShell: “La ejecución de scripts está deshabilitada”

    • Linux/macOS: “Comando no encontrado”

Solución

    • Windows PowerShell: Cambia la política de ejecución. Abre PowerShell como administrador y ejecuta lo siguiente:

  Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

    • Linux/macOS: Verifica que el archivo venv/bin/activate exista y que la ruta sea correcta.

2. `pip install` falla

Detalles del problema

Si al intentar instalar paquetes desde requirements.txt se produce un error, por ejemplo:

    • No se puede descargar un paquete específico

    • Paquetes antiguos causan problemas de compatibilidad

Solución

    • Verifica la conexión a Internet: Asegúrate de no estar desconectado.

    • Limpiar la caché y volver a intentar:

  pip install --no-cache-dir -r requirements.txt

    • Instalar paquetes individualmente para identificar la causa:

  pip install package_name

    • Actualizar dependencias antiguas:

  pip install --upgrade pip setuptools

3. El entorno no funciona después de instalar `requirements.txt`

Detalles del problema

Si los paquetes se instalaron correctamente pero la aplicación aún no funciona, revisa lo siguiente:

Solución

    • Verificar el archivo `requirements.txt`: Asegúrate de que no haya versiones antiguas de los paquetes listados.

    • Resolver conflictos de dependencias:

  pip check

Los paquetes en conflicto se mostrarán y podrás ajustar sus versiones según sea necesario.

4. El entorno virtual está dañado

Detalles del problema

Si el entorno virtual está dañado y no funciona correctamente o las dependencias están rotas, sigue estos pasos:

Solución

    • Elimina el entorno virtual y créalo de nuevo:

  rm -rf venv
  python -m venv venv

    • Reinstala las dependencias con requirements.txt:

  pip install -r requirements.txt

5. `pip freeze` incluye paquetes innecesarios

Detalles del problema

Puede que pip freeze incluya paquetes no deseados en el archivo requirements.txt.

Solución

    • Elimina los paquetes innecesarios manualmente o usa pip uninstall para desinstalarlos.

    • Vuelve a crear el entorno virtual e instala solo los paquetes necesarios.

Resumen

Los problemas relacionados con los entornos virtuales y requirements.txt se pueden resolver verificando la configuración del entorno y las dependencias. Al conocer los problemas comunes y sus soluciones, puedes avanzar con el desarrollo sin dificultades.

Ejemplo avanzado: Integración con Docker

Los entornos virtuales y requirements.txt también son útiles cuando trabajas con proyectos Python en Docker. A continuación, te mostramos cómo integrarlos en tu flujo de trabajo con Docker.

1. Beneficios de usar Docker con un entorno virtual

Al usar Docker, puedes obtener los siguientes beneficios:

    • Contener todo el proyecto, incluidos los entornos virtuales.

    • Asegurar la coherencia entre los equipos y en los entornos de producción.

    • Absorber diferencias entre sistemas operativos y configuraciones, proporcionando un entorno más reproducible.

2. Creación del Dockerfile

A continuación, se muestra un ejemplo de un Dockerfile que usa requirements.txt para configurar un entorno Python:

# Especifica la imagen base
FROM python:3.10-slim

# Configura el directorio de trabajo
WORKDIR /app

# Copia el archivo requirements.txt al contenedor
COPY requirements.txt ./

# Instala los paquetes necesarios
RUN pip install --no-cache-dir -r requirements.txt

# Copia el código de la aplicación
COPY . .

# Ejecuta la aplicación (si es necesario)
CMD ["python", "app.py"]

3. Estructura recomendada del proyecto

Cuando trabajes con Docker y entornos virtuales, es recomendable seguir una estructura de directorios como la siguiente:

my_project/
├── app.py
├── requirements.txt
├── Dockerfile
└── other_project_files/

4. Construcción y ejecución de la imagen de Docker

Ejecuta los siguientes comandos para construir la imagen de Docker y ejecutar el contenedor:

# Construye la imagen de Docker
docker build -t my-python-app .

# Inicia el contenedor
docker run -it --rm my-python-app

5. Uso de Docker Compose (opcional)

Si necesitas gestionar múltiples contenedores, es útil crear un archivo docker-compose.yml.

version: "3.8"
services:
  app:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/app
    command: python app.py

Usa el siguiente comando para iniciar los contenedores con Docker Compose:

docker-compose up

6. Mejores prácticas con Docker

    • Selecciona una imagen base ligera (por ejemplo, python:3.10-slim).

    • Minimiza la caché utilizando la opción --no-cache-dir.

    • No incluyas archivos innecesarios en el contenedor mediante .dockerignore.

7. Ejemplo práctico: Aplicación Flask

Un ejemplo simple de una aplicación web usando Flask:

    • requirements.txt:

  flask==2.3.2

    • app.py:

  from flask import Flask
  app = Flask(__name__)

  @app.route('/')
  def home():
      return "¡Hola, Docker!"

  if __name__ == "__main__":
      app.run(host="0.0.0.0", port=5000)

Si construyes y ejecutas esto con Docker, la aplicación Flask se iniciará de inmediato.

Resumen

Al combinar Docker, entornos virtuales y requirements.txt, puedes eliminar las diferencias entre los entornos de desarrollo y producción, creando sistemas altamente reproducibles. Esta integración proporciona una base sólida para un flujo de trabajo eficiente y estable.

Resumen

Este artículo cubrió en detalle cómo utilizar entornos virtuales y requirements.txt para gestionar proyectos Python de manera eficiente. Usando entornos virtuales puedes gestionar de manera segura las dependencias, y requirements.txt ayuda a mejorar la reproducibilidad del proyecto. Además, la integración con Docker asegura una configuración coherente desde el desarrollo hasta la producción.

Al aprovechar estas herramientas y técnicas, puedes operar proyectos Python de manera más eficiente y estable.

Índice