Entrada

Entornos virtuales de Python

Un entorno virtual en Python es una herramienta que permite crear un espacio aislado para el desarrollo de proyectos. Esto es especialmente útil porque cada proyecto puede tener sus propias dependencias y versiones de librerías externas, sin interferir con otros proyectos o con la instalación global de Python en tu sistema.

Configurar entorno virtual

Cuando instalamos Python3 obtenemos un único entorno global que es compartido por todos los proyectos y todo el código de Python. Si bien podríamos instalar Django y otros paquetes en el entorno global. Sin embargo sólo puedes instalar una versión en particular de cada paquete.

Las aplicaciones Python instaladas en el entorno global pueden entrar en conflicto potencialmente unas con otras (Ej. si dependen de diferentes versiones del mismo paquete).

Si instalamos Django dentro del entorno por defecto/global sólo podrás apuntar a una sóla versión de Django en la computadora. Esto puede ser un problema si quieres crear en el futuro nuevos sitios (usando las útilmas versiones de Django) pero manteniendo los sitios web que dependen de versiones más antiguas.

Como resultado, los desarrolladores experimentados normalmente configuran y ejecutan las aplicaciones Python dentro de entornos virtuales Python independientes.

---
title: Entornos Virtuales
---
graph TD
    B(<img src="https://enidev911.github.io/fullstack-python/assets/img/base.png"  />Python 3.9)
    B---T[Entornos Virtuales]
    T-->C(<img src="https://enidev911.github.io/fullstack-python/assets/img/venv1.png" />Python 3.9)
    T-->D(<img src="https://enidev911.github.io/fullstack-python/assets/img/venv2.png" />Python 3.9)
    T-->E(<img src="https://enidev911.github.io/fullstack-python/assets/img/venv3.png" />Python 3.9)
    subgraph ''
    C-->CD[Django==2.0]
    D-->DD[Django==2.2]
    E-->ED[Django==3.2]
    end

Instalación de Software para crear entorno virtual

Después de instalar Python y pip, procedemos a instalar virtualenvwrapper (que incluye virtualenv) usando pip3:

1
sudo pip3 install virtualenvwrapper

A continuación se añade las siguientes líneas en el archivo de inicio del shell (éste es un archivo oculto .bashrc o .zshrc si usas zsh)

1
2
3
4
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh
  1. La variable WORKON_HOME determina en qué directorio se deben crear los entornos virtuales de Python.

  2. Por último, se debe agregar esta línea al archivo ~/.bashrc para especificar en dónde está ubicado el ejecutable de virtualenvwrapper.

Cómo crear entornos virtuales

Se debe ejecutar el comando mkvirtualenv más el nombre del entorno virtual Python que queremos crear:

1
mkvirtualenv nombre_entorno

Cómo activar un entorno virtual

Para activar un virtualenv con Virtualenvwrapper solamente se necesita ejecutar el comando workon más el nombre del virtualenv en la terminal:

  • 1
    
    workon django-test
    
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    created virtual environment CPython3.9.2.final.0-64 in 9185ms
      creator CPython3Posix(dest=/home/enidev911/.virtualenvs/django-test, clear=False, no_vcs_ignore=False, global=False)
      seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/enidev911/.local/share/virtualenv)
        added seed packages: pip==24.1, setuptools==70.1.0, wheel==0.43.0
      activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
    virtualenvwrapper.user_scripts creating /home/enidev911/.virtualenvs/django-test/bin/predeactivate
    virtualenvwrapper.user_scripts creating /home/enidev911/.virtualenvs/django-test/bin/postdeactivate
    virtualenvwrapper.user_scripts creating /home/enidev911/.virtualenvs/django-test/bin/preactivate
    virtualenvwrapper.user_scripts creating /home/enidev911/.virtualenvs/django-test/bin/postactivate
    virtualenvwrapper.user_scripts creating /home/enidev911/.virtualenvs/django-test/bin/get_env_detail
    

Cómo eliminar entornos virtuales

Al ejecutar el comando rmvirtualenv más el nombre del virtualenv, virtualenvwrapper se encarga de borrar el virtualenv con todas los paquetes que hayamos instalado en él:

1
rmvirtualenv nombre_entorno

¿Qué es Pipenv?

Pipenv es una gran herramienta que administra entornos virtuales que destaca de las otras introduciendo otras características mucho más flexibles.

Automáticamente crea y maneja un entorno virtual para tus proyectos, también como agregar/remover paquetes desde tu archivo Pipfile.lock, que es usado para producir un determinado build.

Pipenv está destinado principalmente a proporcionar a usuarios y desarrolladores de aplicaciones un método sencillo para configurar un entorno de trabajo.

Por defecto, Pipenv guarda todos sus entornos virtuales en un solo lugar. Usualmente esto no es un problema, pero si te gustaría cambiarlo para comodidad de desarrollo, o si esta causando issues en servidores de construcción puedes setear la variable de entorno PIPENV_VENV_IN_PROJECT para crear un entorno virtual dentro de la raíz de tu proyecto.

Por defecto, Pipenv inicializará un proyecto usando cualquier versión de python que tenga python3. Además de iniciar un proyecto con las banderas --three o --two, también puedes setear la variable PIPENV_DEFAULT_PYTHON_VERSION para especificar cual versión usa cuando se inicie un proyecto.

Instalación

Versión requerida de Python:

  • PyPI - Python Version

Página en pipy:

  • PyPi

En la terminal con el siguiente comando, procedemos a la instalación:

1
pip install --user pipenv

Esto se hace para prevenir romper cualquier paquete de sistema. Si pipenv no esta disponible en tu shell después de la instalación, vas a necesitar agregar la carpeta raiz de binarios del usuario a tu PATH en mi caso (windows) C:\Users\home\AppData\Roaming\Python\Python38\Scripts

Instalación con Homebrew

Debes tener instalado Homebrew, luego ejecuta el siguiente comando en el terminal:

1
brew install pipenv

Para actualizarlo en cualquier momento, puedes ejecutar el siguiente comando:

1
brew upgrade pipenv

Administrar entornos virtuales con Pipenv

Crea un entorno virtual con la versión 3 de Python:

1
pipenv install --three

Crea un entorno virtual con la versión 2 de Python (debe tener instalado en su sistema python 2.x)

1
pipenv install --two

Activar un entorno virtual (si no existe, lo crea en el directorio actual)

1
pipenv shell

Salir del entorno virtual previamente activado:

1
exit

Instalar paquetes:

1
pipenv install requests

Eliminar un paquete o eliminar todos los paquetes:

1
2
pipenv uninstall django
pipenv uninstall --all

Ejecutando un script usando pipenv run:

1
pipenv run python main.py

Para evitar escribir el comando tan largo podemos activar el entorno virtual simplemente y luego ejecutar el script:

1
2
pipenv shell
python main.py

Instalar las dependencias de un archivo Pipfile:

1
pipenv install

Ejemplo de Pipfile & Pipfile.lock

Ejemplo de Pipfile:

1
2
3
4
5
6
7
8
9
10
11
12
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[dev-packages]

[packages]
django = "*"

[requires]
python_version = "3.7"
  • [source]: nos muestra el enlace de donde se descargan los paquetes.
  • [dev-packages]: aquí se registran las librerías solo para desarrollo.
  • [packages]: aquí se registran todos los paquetes requeridos para el proyecto, cuando instalemos los paquetes con el comando pipenv install .

Ejemplo de Pipfile.lock:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
    "_meta": {
        "hash": {
            "sha256": "7e7ef69da7248742e869378f8421880cf8f0017f96d94d086813baa518a65489"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.7"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {},
    "develop": {}
}

Recomendaciones generales & control de versiones

  • Generalmente, mantén a ambos Pipfile y Pipfile.lock en tu control de versión.
  • No mantengas Pipfile.lock en tu control de version si estas usando multiples versiones de Python
  • Especifica tu versión de Python en la sección [requires] de tu Pipfile. En resumen, deberias tener solo una versión de Python, como herramienta de desarrollo.
  • Siempre utiliza pipenv install para que se agregue a la lista de [packages] en el Pipfile.

Mi lema es

Esta entrada está licenciada bajo CC BY 4.0 por el autor.