Crear entornos virtuales en Python para desarrollar apps en Django, Flask o FastAPI

Video thumbnail

Vamos a hablar sobre los espacios virtuales en Python; específicamente nuestro caso de interés que sería para crear aplicaciones en Django, Flask o FastAPI o en resumen, cualquier proyecto en Python, usualmente, creamos un entorno virtual.

Los espacios virtuales son sencillamente una herramienta utilizada para crear un entorno de Python aislado del resto del Sistema Operativo y de esta manera podemos desarrollar nuestras apps en Python con versiones específicas de un framework, Python o sus dependencias.

Cuando comencé a desarrollar con Python, me encontré con un problema muy común: cada proyecto requería versiones distintas de los mismos paquetes, y aquello se volvía un caos.

La solución que descubrí fue usar entornos virtuales, una herramienta sencilla pero poderosa que te permite mantener cada proyecto completamente aislado.

Específicamente se emplean al momento del desarrollo de software con Python; es muy común querer emplear varias versiones de un mismo paquete en diferentes proyectos; y para evitar estar instalando y desinstalando (ya que no podemos instalar dos veces un paquete en nuestro SO o venv), podemos crear un ambiente con el objetivo específico de aislar estas múltiples versiones de este o varios paquetes; por tal motivo en este espacio se encontraran solamente los paquetes que vas a emplear para desarrollar tus aplicaciones en Python, ya sea nativo o con algún framework como Django o Flask.

En definitiva, con los entornos virtuales podemos instalar una versión específica de ese paquete que necesitamos para un proyecto o proyectos en particular, así como el resto de las dependencias que tenga un proyecto.

Qué es un entorno virtual en Python y para qué sirve

Qué es un entorno virtual en Python y para qué sirve

Un entorno virtual (o virtual environment) es, básicamente, un espacio aislado dentro de tu sistema operativo donde puedes instalar paquetes de Python sin afectar al resto del sistema.
Esto significa que puedes tener varios proyectos con distintas versiones de Django o de cualquier librería sin que interfieran entre sí.

En mi caso, suelo crear un entorno nuevo para cada proyecto, especialmente cuando trabajo con frameworks como Django o Flask, porque así evito conflictos de dependencias y puedo actualizar o probar versiones sin riesgo.

Ventajas de usar entornos virtuales en Django

  • Aíslan tus dependencias por proyecto.
  • Evitan conflictos entre versiones de paquetes.
  • Te permiten compartir fácilmente tus requerimientos con otros desarrolladores.
  • Facilitan la instalación de entornos iguales en distintos equipos.

Diferencia entre venv y virtualenv

  • venv: viene integrado con Python 3, así que no necesitas instalar nada extra.
  • virtualenv: es un paquete externo que ofrece más flexibilidad, sobre todo si usas varias versiones de Python.
  • Yo utilizo venv la mayoría de las veces, pero todavía recurro a virtualenv cuando quiero mayor control sobre versiones.

¿Cómo Instalar un entorno virtual?

Nosotros podemos hacernos con la herramienta que nos permite crear venv o entornos virtuales en nuestro equipo; que como puedes ver, es solamente un paquete que lo podemos hacer mediante la pip que recuerda que ya contamos con la misma en versiones recientes de Python:

pip3 install virtualenv

Requisitos previos antes de crear tu entorno

Antes de empezar, asegúrate de tener Python y pip instalados correctamente en tu sistema.

Verificar instalación de Python y pip

Abre tu terminal (o CMD en Windows) y escribe:

$ python --version
$ pip --version

Si obtienes un número de versión, todo está en orden.

Si no, puedes descargar Python desde python.org/downloads

Instalar la herramienta virtualenv

Si prefieres usar virtualenv en lugar de venv, instala el paquete así:

$ pip install virtualenv

Este comando descargará e instalará la herramienta necesaria para crear entornos virtuales.

Crear un entorno virtual en Python paso a paso

Ya con esto podemos crear los espacios virtuales; para eso el siguiente comando:

$ virtualenv <myproject>

En donde <myproject> es el nombre de tu espacio virtual; ahora bien; con el comando anterior se creó una carpeta con el nombre del venv que definistes en el comando anterior, y es esa carpeta tu espacio virtual ya listo para emplear.

Ahora, para emplear el espacio virtual anterior simplemente tenemos que movernos mediante nuestra CMD o terminal hacia dentro de la carpeta llamada Script; que es donde se encuentran nuestros Script para poder gestionar el espacio virtual mediante los archivos binarios contenidos en la misma; para activar o desactivar el ambiente virtual.

Estructura de carpetas generada

Una vez creado el entorno, verás algo como esto:

myproject/

├── Scripts/ (en Windows)
├── bin/ (en Linux/macOS)
├── Lib/
└── pyvenv.cfg

Activar y desactivar el entorno virtual

Estando en la ubicación comentada anteriormente, verás que tenemos varios archivos para trabajar con nuestro entorno o espacio virtual en Python, algunos llamados activate / deactivate que nos permiten activar o desactivar el espacio virtual.

Lo primero que quisiéramos hacer sería activar nuestro ambiente virtual:

En Windows

$ myproject\Scripts\activate

Notarás que el nombre del entorno aparece al inicio de tu línea de comandos, por ejemplo:

(myproject) C:\Users\andre\Escritorio>

En Linux y macOS

source myproject/bin/activate

O si queremos desactivar el entorno virtual:

deactivate

Este sería nuestro estado inicial antes de ejecutar el comando de activate dentro de la carpeta Script:

C:\Users\andre\OneDrive\Escritorio\myproject\Scripts>

Ahora, vamos a desactivar el espacio virtual con el comando de:

activate

Recordemos qué son los ambientes virtuales

Los ambientes virtuales son, por decirlo de alguna manera, una cajita aislada del sistema operativo.
Dentro de esta cajita tenemos todos los paquetes y dependencias necesarios para un proyecto específico.

Independientemente de la jerga que usemos —ya sea en Django o en otro framework—, cada proyecto o aplicación (por ejemplo, una tienda en línea) suele estar vinculado a un único ambiente virtual.

Por qué crear un ambiente virtual por proyecto

Si deseas crear otro proyecto en Django, lo ideal es crear un nuevo ambiente virtual.
Esto se debe a que, muy probablemente, esos proyectos trabajarán con paquetes o versiones diferentes.

Por ejemplo, además de Django, solemos instalar otros complementos aprovechando el ecosistema de Python.
Cada proyecto puede requerir librerías distintas, por lo que mantener los ambientes separados garantiza que las dependencias sean exclusivas y evita mezclar configuraciones entre proyectos.

Creando el archivo de requerimientos

Una vez que tienes tu ambiente virtual configurado, es buena idea crear el archivo requirements.txt, donde se listarán todos los paquetes necesarios para tu proyecto.
Este archivo te permitirá replicar fácilmente tu entorno en otro equipo o servidor, asegurando que todos los componentes sean exactamente los mismos.

Instalar Django, Flask, FastAPI dentro del entorno virtual

Y ahora nuestra terminal luce de la siguiente manera:

venv activado en terminal o CMD

Y con esto podemos realizar todo lo que queramos; por ejemplo, podemos crear un proyecto específico en Flask o Django o simplemente el último en el mercado

$ pip install django

Flask:

$ pip install flask

FastAPI:

$ pip install fastapi uvicorn

Y esto es todo, ya tenemos Django (o el framework que hayas seleccionado) instalado en nuestro espacio virtual; pero, solo instalamos un paquete, y no tenemos un proyecto; pero, con este paquete podemos crear proyectos en Django:

Si hacemos un:

$ pip freeze

Verás todos los paquetes que componen el paquete que instalamos anteriormente; algo como:

asgiref==3.7.2
Django==5.0
sqlparse==0.4.4
tzdata==2023.3

Como comentamos antes, es muy común qué al instalar paquetes vía la pip, estos paquetes también necesitan de otros paquetes para poder funcionar, y con esto, también son instaladas las mismas, y a estos, se les conoce como dependencias.

En el ejemplo anterior, los paquetes de asgiref, sqlparse, tzdata son dependencias del paquete Django.

Importante notar que, seguramente tu tendrás algunas versiones un poco más recientes y no exactamente las mismas listadas aquí (la versión de cada paquete se encuentra luego del ==).

Como puedes ver, el comando anterior, indica todos los paquetes instalados a nivel del espacio virtual (si el mismo está activo) o del sistema operativo (si el espacio virtual está desactivado o simplemente no lo estás empleando).

Guardar y restaurar dependencias del proyecto

Una de las prácticas que siempre aplico es guardar las dependencias exactas que uso en cada proyecto.
Para hacerlo, ejecuto:

appdirs==1.4.3
asgiref==3.2.4
astroid==2.3.3
certifi==2020.4.5.1
cffi==1.14.0
chardet==3.0.4
colorama==0.4.3
cryptography==2.9
defusedxml==0.6.0
diff-match-patch==20181111
distlib==0.3.0
Django==3.0.4
django-admin-interface==0.12.2
django-bootstrap-form==3.4
django-colorfield==0.3.0
django-cors-headers==3.2.1
django-debug-toolbar==2.2
django-filter==2.2.0
django-flat-responsive==2.0
django-flat-theme==1.1.4
django-grappelli==2.14.1
django-import-export==2.0.2
django-material==1.6.3
django-sql-explorer==1.1.3
djangorestframework==3.11.0
easy-thumbnails==2.7
et-xmlfile==1.0.1
filelock==3.0.12
idna==2.9
isort==4.3.21
jdcal==1.4.1
lazy-object-proxy==1.4.3
MarkupPy==1.14
mccabe==0.6.1
odfpy==1.4.1
openpyxl==3.0.3
paypalrestsdk==1.13.1
Pillow==7.0.0
pycparser==2.20
pylint==2.4.4
PyMySQL==0.9.3
pyOpenSSL==19.1.0
pytz==2019.3
PyYAML==5.3.1
requests==2.23.0
rjsmin==1.1.0
six==1.14.0
sqlparse==0.3.1
tablib==1.1.0
unicodecsv==0.14.1
urllib3==1.25.9
virtualenv==20.0.17
wrapt==1.11.2
xlrd==1.2.0
xlwt==1.3.0

Puedes obtener todos los paquetes instalados en tu SO o ambiente virtual con el comando de:

pip freeze

Y puedes guardarlo en un archivo para que puedas especificar específicamente cuales son las versiones específicas de tu proyecto:

pip freeze > requirements.txt

Que luego puedes instalar fácilmente mediante:

pip install -r requirements.txt

Por lo tanto, fácilmente puedes crear un ambiente para un proyecto en particular o simplemente para el proyecto que estás llevando a cabo empleando los ambientes virtuales; cómo ves la enorme ventaja que tenemos es que podemos instalar versiones específicas de nuestros paquetes.

Ya en este punto estamos listos y podemos empezar a desarrollar nuestras aplicaciones en Flask o empezar a desarrollar nuestras aplicaciones en Django.

Tambien, puedes  instalar versiones especificas con el == por ejemplo:

$ pip install Django==5.0

Consejos finales para mantener tu entorno limpio y estable

Crea un entorno virtual por cada proyecto.

Evita instalar paquetes globalmente.

Usa requirements.txt para controlar versiones.

Si un entorno se corrompe o da errores, elimínalo y créalo de nuevo: ¡es rápido y seguro!

Mantén Python y pip actualizados para evitar incompatibilidades.

En mi experiencia, usar entornos virtuales te evita dolores de cabeza y te da control total sobre tus proyectos Django.

Preguntas frecuentes sobre entornos virtuales y Django

  • ¿Qué es un entorno virtual en Python?
    Es un espacio aislado donde puedes instalar dependencias sin afectar al sistema principal.
  • ¿Por qué usar un entorno virtual con Django?
    Porque Django depende de muchas librerías que pueden variar de versión entre proyectos.
  • ¿Qué diferencia hay entre venv y virtualenv?
    venv viene con Python 3; virtualenv es una herramienta externa más antigua pero aún útil.
  • ¿Cómo activo mi entorno virtual?
    En Windows: myenv\Scripts\activate
    En Linux/macOS: source myenv/bin/activate
  • ¿Cómo guardo mis dependencias?
    Con pip freeze > requirements.txt puedes exportarlas y reinstalarlas fácilmente.

Opcional  Seleccionar intérprete mediante Visual Studio Code

La mayoría de las veces VSC no reconocerá el intérprete de Python que se configura al momento de instalar un ambiente virtual si no, tomará (el instalado a nivel global del SO) el del sistema, esto trae el inconveniente de que aparecen estas advertencias en las importaciones de la aplicación:

 Seleccionar intérprete

Y por lo tanto, no es posible acceder al detalle de los módulos importados; para solucionar esto, debemos de indicarle a VSC que el intérprete que debe usar es el del ambiente virtual que es donde tenemos instalado todo el ecosistema del proyecto de Django y no el del Sistema Operativo.

Presione la combinación de teclas: Command/Control + Shift + P y buscas por "Seleccionar intérprete":

Ventana para seleccionar intérprete con Command/Control + Shift + P

Y seleccionar el de tu ambiente virtual desde la opción de "+ Escriba la ruta de acceso del intérprete":

Seleccionar Python para el intérprete

En caso de que, con el hecho de seleccionar el intérprete, aún siga mostrando la advertencia de:

***No se ha podido resolver la importación "X"

Puedes probar crear un proyecto desde cero mediante VSC; para ello, abre una instancia limpia de VSC, luego, Command/Control + Shift + P y buscas por "Crear ambiente":

Crear ambiente virtual

Sigues los pasos que te indica el editor, que sería que selecciones el entorno, colocamos "Venv":

Seleccionar venv

Luego, puede que te indique que coloques el área de trabajo:

Seleccionar área de trabajo

Y vuelves al paso 1, que sería Command/Control + Shift + P y buscas por "Crear ambiente"; en esta oportunidad, debería de preguntarte por el intérprete que quieras emplear para crear el área de trabajo:

Seleccionar intérprete de Python

Y con esto debería de reconocerse los paquetes instalados a nivel del ambiente virtual.

Conclusión

Crear un entorno virtual en Python para Django no es complicado, y una vez que entiendes su propósito, se vuelve parte natural de tu flujo de trabajo.

En mi caso, fue un antes y un después en la organización de mis proyectos.

Te animo a que lo pruebes tú mismo: en pocos minutos tendrás tu propio entorno listo para crear cualquier aplicación en Django, Flask o FastAPI.

El siguiente paso, es conocer sobre el qué es Django framework.

Acepto recibir anuncios de interes sobre este Blog.

Vamos a conocer los espacios virtuales para poder crear nuestras apps en Python nativo, Flask, Django o cualquier otro.

| 👤 Andrés Cruz

🇺🇸 In english