Entornos fant谩sticos y d贸nde encontrarlos
Tabla de contenido
Este post busca ser una gu铆a de instalaci贸n para los entornos que uso en mis cursos de Computaci贸n Gr谩fica (CG) y Visualizaci贸n de Informaci贸n (VIS).
驴No basta con tener una instalaci贸n de Python? #
Digamos que tienes Python instalado en tu sistema. Por ejemplo, en CG y VIS trabajamos con m煤ltiples bibliotecas:
- En CG: pyglet, numpy, trimesh, scipy…
- En VIS: matplotlib, geopandas, pyrosm, graph-tool…
Una situaci贸n imaginaria (con n煤meros de versiones inventados) pero que ilustra el caso base es la siguiente:
Esta situaci贸n, donde todo est谩 mezclado con todo, puede generar conflictos. No es raro que debamos hacer cosas como pip install biblioteca
para que el m贸dulo biblioteca
est茅 disponible en nuestro sistema (recuerda que pip
es un programa que permite instalar bibliotecas de Python). Pero, 驴realmente es posible instalar herramientas heterog茅neas y que funcionen bajo el mismo paraguas? La verdad es que no. Podr铆an pasar cosas como:
biblioteca
no es compatible con uno de los m贸dulos que ya tengamos instalados.- Las dependencias de los m贸dulos que necesito en cada curso no son compatibles. Probablemente al instalar
biblioteca
se sobreescriben algunas de las dependencias que ya estaban instaladas para otro m贸dulo, y ese m贸dulo deja de funcionar… - … o, si funciona, podr铆a dar resultados err贸neos en ciertos c谩lculos (esto puede suceder, por ejemplo, ante cambios en
numpy
o similares).
Estos conflictos son un gran problema porque la correctitud y reproducibilidad de nuestros resultados est谩 en riesgo.
Una soluci贸n es usar entornos o ambientes.
Pero… 驴qu茅 es un entorno o ambiente? #
Es una buena pregunta :) Es el conjunto de herramientas que tienes instaladas para tu desarrollo, incluyendo los int茅rpretes de lenguajes de programaci贸n (como Python) y compiladores (para lenguajes como C). De cierto modo, la imagen anterior ilustra un ambiente: el del sistema. 隆Pero eso no implica que no puedas tener ambientes adicionales! Por ejemplo, yo tengo al menos dos entornos: grafica
(para CG) y aves
(para VIS):
Cada uno de mis ambientes tienen su propia versi贸n de Python y las bibliotecas necesarias para el proyecto en el que trabajo con ese ambiente. Incluso pueden ser versiones diferentes. As铆, trabajar con ambientes permite aislar las herramientas de un proyecto para que no interfieran con las de otro, asegurar la compatibilidad entre ellas y trabajar de manera independiente a la configuraci贸n del sistema, lo que asegura la reproducibilidad de tu c贸digo.
驴C贸mo gestiono y configuro entornos? #
Utilizar un programa gestor de entornos. En Python, una manera cl谩sica es utilizando virtual env
https://docs.python.org/es/3.13/library/venv.html; una moderna, es utilizando uv
https://docs.astral.sh/uv/. En ambos casos puedes tener un “entorno virtual” en el que existen versiones independientes de las bibliotecas que necesites, cada uno con su propia versi贸n de Python.
Sin embargo, surgen dificultades cuando tu proyecto tiene requisitos que van m谩s all谩 de Python. Es com煤n que una biblioteca requiera m贸dulos creados con otros lenguajes de programaci贸n o herramientas externas. En esos casos, una soluci贸n enfocada en Python a veces no es suficiente: hay que usar un gestor que trabaje con m煤ltiples plataformas.
Desconozco todas las alternativas existentes. Una de ellas, posiblemente la m谩s usada, es conda
(parte de Anaconda). conda
te permite crear entornos. Tiene su propio repositorio de m贸dulos y herramientas que puedes tener de manera independiente. Yo uso conda
, pero con un twist: Anaconda es una “distribuci贸n”, es decir, un conjunto sumamente completo de herramientas (incluyendo Python) que incluye el gestor conda
. Si instalas Anaconda, tendr谩s conda
y tambi茅n muchas cosas ya instaladas, sin perjuicio de que puedas crear nuevos entornos. La gracia de esto, es que Anaconda tiene repositorios con bibliotecas y herramientas. En vez de utilizar el programa pip
, utilizas conda
, que lee de esos repositorios, y as铆 puede saber que una biblioteca en Python puede requerir un programa en Java o un m贸dulo en Rust.
Aunque instalar un paquete (que es m谩s general que biblioteca) se hace de manera similar: conda install paquete
, esa no es la manera adecuada de usar conda
. Lo ideal es tener un archivo que configura el entorno. Este es el archivo environment.yml
de mi entorno grafica
:
name: grafica
channels:
- conda-forge
- defaults
dependencies:
- numpy
- pip
- pyopengl
- python
- mesa>=2.3.0
- trimesh
- networkx
- pillow
- matplotlib
- scipy
- cffi
- shapely
- rtree
- click
- pip:
- pyglet>=2.0.0
- pymunk
Este archivo incluye el nombre del entorno (name: grafica
), dice desde d贸nde se deben descargar los paquetes (channels: ...
) y define las dependencias (dependencies: ...
). La dependencia mesa
define un n煤mero de versi贸n (>=2.3.0
). En rigor, eso se puede hacer para cada paquete (de hecho, es lo recomendado). Algo interesante sucede: pip
es una dependencia tambi茅n, y, de hecho, se especifican dos paquetes que se deben instalar con pip
(y uno con versi贸n). Esto se debe a que los canales de distribuci贸n de conda
no necesariamente tienen todo lo que est谩 disponible en pip
.
El comando conda env create -f environment.yml
se encarga de descargar todos los paquetes necesarios para que este entorno funcione. De hecho, hay dependencias que no est谩n declaradas: 驴qu茅 paquetes necesita la biblioteca shapely
? Muchos que no aparecen en este archivo. conda
se encarga de todo.
Despu茅s de unos minutos de descarga y configuraci贸n, el comando conda activate grafica
activar谩 tu entorno y ejecutar python
abrir谩 el int茅rprete de la versi贸n que necesitas y no la que tiene el entorno del sistema.
Existen m谩s herramientas de este estilo:
- Miniconda es una versi贸n de
conda
que no instala la distribuci贸n Anaconda. mamba
es una implementaci贸n eficiente de la interfaz deconda
, es decir, puedes ejecutar los mismos comandos y el resultado ser谩 id茅ntico, pero en menos tiempo y con menos gasto de energ铆a.- Micromamba es una versi贸n m铆nima de
mamba
: incluye solamente el comandomicromamba
, que mantiene la interfaz deconda
, pero nada m谩s. Ni siquiera instala un entorno base.
Hoy yo uso micromamba
. De hecho, tengo configurado mi sistema para que al ejecutar conda
en realidad se llame al programa micromamba
. El enlace previo lleva a sus instrucciones de instalaci贸n.
Anaconda Prompt
.
驴C贸mo asegurar reproducibilidad? #
Una manera sencilla de hacerlo es exportando el entorno. El comando conda list -n grafica --export
imprime la lista de paquetes instalados en el entorno grafica
con su versi贸n exacta. Aqu铆 hay un ejemplo (lo edit茅 para que no ocupase tanto espacio, porque incluye las dependencias impl铆citas – las partes que dicen [...]
en realidad contienen varios paquetes):
$ conda list -n grafica --export
# This file may be used to create an environment using:
# $ conda create --name <env> --file <this file>
# platform: win-64
_openmp_mutex=4.5=2_gnu
brotli=1.1.0=h2466b09_2
brotli-bin=1.1.0=h2466b09_2
bzip2=1.0.8=h2466b09_7
ca-certificates=2025.2.25=haa95532_0
cairo=1.18.2=h5782bbf_1
cffi=1.17.1=py313ha7868ed_0
click=8.1.8=pyh7428d3b_0
[...]
libbrotlienc=1.1.0=h2466b09_2
libcblas=3.9.0=31_h5e41251_mkl
[...]
llvmlite=0.44.0=py313hb80970b_0
matplotlib=3.10.1=py313hfa70ccb_0
matplotlib-base=3.10.1=py313h81b4f16_0
mesa=3.1.4=pyhd8ed1ab_0
mkl=2024.2.2=h66d3029_15
munkres=1.1.4=pyh9f0ad1d_0
networkx=3.4.2=pyh267e887_2
numba=0.61.0=py313h4ca4f0f_1
numpy=2.1.3=py313hee8cc43_0
openjpeg=2.5.3=h4d64b90_0
[...]
pycparser=2.22=pyh29332c3_1
pyglet=2.1.3=pypi_0
pymunk=6.11.1=pypi_0
pyopengl=3.1.7=pyhd8ed1ab_0
pyparsing=3.2.1=pyhd8ed1ab_0
pyside6=6.8.2=py313h3e3797f_1
python=3.13.2=h261c0b1_101_cp313
[...]
tqdm=4.67.1=pyhd8ed1ab_1
trimesh=4.6.4=pyh7b2049a_0
[...]
Con esta informaci贸n puedes recrear el entorno de manera exacta.
驴Existen otras alternativas? #
Hoy, sobre todo en el mundo del desarrollo y del software en producci贸n, se habla m谩s de contenedores que de entornos. Un ejemplo de tecnolog铆a de contenedor es docker. El paradigma de los contenedores es potente, puesto que adem谩s de asegurar que est茅 instalado todo lo que necesita tu entorno con sus versiones correctas, tambi茅n se encarga de las condiciones del sistema que rodean al entorno, incluyendo sistemas de archivos y acceso a recursos. En resumen, si descargas un contenedor, puedes ejecutarlo directamente y tu c贸digo se ejecutar谩 en condiciones que controlar totalmente.
Suena ideal. En el mundo del deployment, lo es.
De hecho, muches estudiantes me entregan sus proyectos de t铆tulo dockerizados:
Profe, en este repositorio est谩 el c贸digo. Levantas el docker y funciona.
(Aqu铆, “levantar” se refiere a descargar el contenedor y activarlo) 隆Es cierto que funciona! El problema es que le estudiante se encarg贸 de tener funcionando el c贸digo en su m谩quina, cre贸 el contenedor y lo entreg贸, sin preocuparse de documentar las versiones o siquiera pensar en la documentaci贸n del programa. Este esquema facilita tanto el deployment que, en mi opini贸n, motiva que nos olvidemos de los fundamentos detr谩s del desarrollo.
Pienso que estas herramientas han abstra铆do tanto la maquinaria que implica la conexi贸n de m煤ltiples herramientas y m贸dulos, que de repente olvidamos que necesitamos dominar ese aspecto. No solo necesitamos que la arquitectura de nuestro sistema sea robusta. Debemos conocerla y entenderla de modo que podamos trabajar en ella tambi茅n. Un caso hip贸tetico: si otra persona llegara a continuar el proyecto de t铆tulo dockerizado y su trabajo consiste en agregar un nuevo componente, cuyas dependencias no son compatibles con las que est谩n incluidas (sin documentar) en el contenedor. 驴Cu谩nto tiempo perder谩 tratando de resolver el problema? 驴Imaginar谩 que es un conflicto de versiones? Tarde o temprano llegar谩 a esa soluci贸n. Una soluci贸n a un problema que no deb铆a existir en realidad.
En la vida laboral te encontrar谩s con contenedores, entornos y, tambi茅n, con software sin ning煤n tipo de configuraci贸n. Solo conociendo los fundamentos podr谩s desenvolverte bien en todos esos ambientes.