Ambientes virtuales en Python: buenas prácticas para desarrollo de software de investigación
RS-Latam 2026
1 Un poco de Contexto
1.1 Reproducibilidad
La reproducibilidad tiene diferentes capas, hoy aprenderemos solo de una parte.

1.2 ¿Por qué hablamos de ambientes?
En RSE, nuestro código no vive aislado.
Para ejecutar un proyecto necesitamos, entre otras cosas:
- una versión de Python;
- paquetes y dependencias;
- versiones compatibles;
- un ambiente donde instalar esas dependencias.
¿Qué necesitas además de
main.pypara ejecutar un proyecto de otra persona?
1.3 Python
Versión de Python
Pueden haber múltiples instaladas en el sistema
Ambiente Virtual
Creamos un espacio aislado para instalar los paquetes que requiere nuestro proyecto
Paquetes
Instalamos las librerías (y sus dependencias) necesarias para que nuestro código funcione
Esto garantiza una capa mínima de reproducibilidad, pero no resuelve:
- Mala organización del proyecto
- Falta de documentación
- Mal diseño de dependencias
- Diferentes sistemas operativos
1.3.1 Versión de Python
Un proyecto puede requerir una versión específica de Python.
Por ejemplo:
Python 3.11
Python 3.12
Python 3.13
Puedes consultar la versión que estás utilizando con:
python --version1.3.2 Paquetes
Python incluye una biblioteca estándar, pero muchos proyectos necesitan paquetes externos.
Por ejemplo:
import pandas
import seabornEstos paquetes deben estar instalados en el ambiente donde ejecutamos nuestro proyecto.
1.3.3 Ambiente virtual
Un ambiente virtual permite mantener aisladas las dependencias de un proyecto.
El caso de pandas. En enero de este año se lanzó la versión 3.0 de pandas que incluye una serie de cambios que hacen que ciertos códigos hechos con versiones anteriores ya no sean compatibles.

Acá es donde tener ambientes separados para nuestros proyectos resulta crucial:
proyecto A
└── ambiente A
└── pandas 2.x
proyecto B
└── ambiente B
└── pandas 3.x
Así, cambiar las dependencias de un proyecto no debería romper otro.
1.4 Muchas Herramientas

2 ¿Qué haremos hoy?
Un pequeño proyecto de Python que:
- lee datos de temperatura desde un CSV disponible en GitHub
- usa
pandaspara trabajar con los datos - usa
seabornpara visualizar una serie temporal - usa
scipypara calcular la tendencia
Esto es algo muy simple porque el foco del taller no es aprender a programar en Python.
Acá aprenderemos a:
Crear un ambiente virtual con venv e instalar los paquetes necesarios con pip
Hacer lo mismo (y más) con uv
3 Preparar el computador
3.1 Python
Necesitamos una instalación funcional de Python.
Comprueba:
python --versionEn algunos sistemas puede ser:
python3 --version3.1.1 Windows
Descarga Python desde la página oficial:
https://www.python.org/downloads/windows/
Durante la instalación, recuerda activar la opción para agregar Python al PATH.

Si al ejecutar algún script en powershell recibes el mensaje:
la ejecución de scripts está deshabilitada en este sistema. Para obtener más información, consulta el tema about_Execution_Policies en https:/go.microsoft.com/fwlink/?LinkID=135170.ejecuta en powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser3.1.2 macOS
Puedes instalar Python desde:
https://www.python.org/downloads/macos/
Si utilizas Homebrew:
brew install python3.1.3 Linux
Consulta las instrucciones oficiales para tu distribución:
https://www.python.org/downloads/
En Ubuntu/Debian, por ejemplo:
sudo apt update
sudo apt install python3 python3-venv python3-pipSi ya tienes Python instalado y python --version funciona, no necesitas instalarlo nuevamente.
4 Forma nativa: venv + pip
4.1 Crear una carpeta para trabajar
Crearemos una carpeta de la manera usual según tu sistema operativo y la abriremos en el IDE que tengan instalado.
Yo estaré trabajando con Positron y VSCode
4.2 Crear el ambiente
Ejecuta en la terminal:
python -m venv .venvEsto crea una carpeta .venv con el ambiente virtual.
4.3 Activar el ambiente
El ambiente debe activarse para ser usado, la manera de activarlo varía según el sistema operativo que utilizamos.
4.3.1 macOS / Linux
En la terminal
source .venv/bin/activate4.3.2 Windows PowerShell
.venv\Scripts\Activate.ps14.3.3 Windows CMD
.venv\Scripts\activate.batCuando el ambiente está activo, normalmente verás (.venv) al comienzo de la línea de comandos.
4.4 Comprobar el Python utilizado
En la terminal
python --version4.5 Crea el archivo de código de ejemplo
Crearemos un nuevo archivo llamado main.py con el siguiente contenido:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Leer datos desde GitHub
url = "https://raw.githubusercontent.com/datasets/global-temp/main/data/annual.csv"
df = pd.read_csv(url)
# Filtrar datos de GISTEMP
df = df[df["Source"] == "GISTEMP"]
# Graficar anomalía de temperatura global
sns.lineplot(data=df, x="Year", y="Mean")
plt.title("Anomalía de temperatura global")
plt.xlabel("Año")
plt.ylabel("Anomalía de temperatura (°C)")
plt.show()4.6 Instalar paquetes
Ahora instalaremos las dependencias del ejemplo:
pip install pandas seabornPuedes revisar qué quedó instalado:
pip listQuiero incluir una línea de tendencia en mi gráfico, así que modifico el código:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import linregress
url = "https://raw.githubusercontent.com/datasets/global-temp/main/data/annual.csv"
df = pd.read_csv(url)
df = df[df["Source"] == "GISTEMP"]
# Calcular regresión lineal
result = linregress(df["Year"], df["Mean"])
# Línea de tendencia
df["Trend"] = result.intercept + result.slope * df["Year"]
# Graficar
sns.lineplot(data=df, x="Year", y="Mean", label="Temperatura")
sns.lineplot(data=df, x="Year", y="Trend", label="Tendencia")
# Ecuación
equation = f"y = {result.slope:.4f}x + {result.intercept:.2f}"
plt.text(
0.05,
0.95,
equation,
transform=plt.gca().transAxes,
verticalalignment="top"
)
plt.title("Anomalía de temperatura global")
plt.xlabel("Año")
plt.ylabel("Anomalía de temperatura (°C)")
plt.tight_layout()
plt.show()Y debo instalar el nuevo paquete
pip install scipy4.7 Guardar las dependencias
Una forma tradicional de registrar las dependencias es:
pip freeze > requirements.txtEsto genera:
requirements.txt
Puedes abrirlo y revisar las versiones instaladas.
4.8 Ejecutar el ejemplo
Ejecuta:
python main.py5 Forma con: uv
uv es una herramienta moderna para gestionar proyectos, ambientes, versiones de Python y dependencias.
Documentación oficial:
Una captura de pantalla sobre lo que promete:

5.1 Instalar uv
5.1.1 macOS y Linux
La instalación oficial ofrece un instalador independiente:
curl -LsSf https://astral.sh/uv/install.sh | shTambién puedes utilizar Homebrew en macOS:
brew install uv5.1.2 Windows
En PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"También puedes instalarlo mediante WinGet:
winget install --id=astral-sh.uv -eDespués de instalar uv, abre una nueva terminal si el instalador te indica que debes actualizar el PATH.
Comprueba la instalación:
uv --version5.2 Crear el proyecto con uv
5.2.1 Proyecto por defecto
Primero exploraremos un proyecto de uv que se crea con las configuraciones por defecto. Es una buena forma de entender cómo estructurar nuestros proyectos de python más complejos.
Haremos una nueva carpeta para trabajar y la abriremos en nuestro IDE.
Puedes crear un proyecto nuevo desde la terminal con:
uv initEsto crea la estructura básica del proyecto como tipo “aplicación empaquetada”
mi-proyecto/
├── .python-version ← versión de Python
├── .venv/ ← ambiente virtual
├── README.md ← documentación
├── pyproject.toml ← configuración y dependencias
├── uv.lock ← versiones concretas de las dependencias
└── src/ ← código fuente
└── mi_proyecto/
└── __init__.py
Este tipo de estructura inicial es muy útil para comenzar nuestros proyectos de manera ordenada y con los archivos mínimos para garantizar su reproducibilidad.
Acá dejo un recordatorio de qué significa cada cosa en el `pyproject.toml``
[project]
name = "proyecto-uv0" # ¿Cómo se llama?
version = "0.1.0" # ¿Qué versión?
description = "..." # ¿Qué hace?
readme = "README.md" # ¿Dónde está la documentación?
authors = [...] # ¿Quién lo desarrolla?
requires-python = ">=3.13" # ¿Qué Python necesita?
dependencies = [...] # ¿Qué paquetes necesita?
[project.scripts]
proyecto-uv0 = "proyecto_uv0:main" # ¿Cómo lo ejecuto?
[build-system]
... # ¿Cómo se construye?5.2.2 Proyecto forma simple
Haremos una nueva carpeta y la abriremos en nuestro IDE. Ahora utilizaremos algunas opciones de uv init para adecuar la estructura a nuestro código simple
uv init --no-package --python 3.13Acá le decimos que queremos una aplicación simple “no empaquetada” y que use la versión 3.13 de python
5.2.2.1 Agregar dependencias
En lugar de instalar los paquetes directamente con pip como en el ejemplo anterior con uv podemos declarar las dependencias del proyecto:
uv add pandas seabornuv crea o actualiza:
pyproject.toml
uv.lock
.venv
Mirar el arbol de dependencias:
uv tree5.2.2.2 Ejecutar el proyecto
Con uv puedes ejecutar el programa mediante:
uv run python main.pyEsto es todo, uv se encargua de utilizar el ambiente y las dependencias correspondientes.
6 Pasar de un método a otro
venv + pip |
uv |
|
|---|---|---|
| Ambiente virtual | venv |
uv venv |
| Activar ambiente | source .venv/bin/activate (macOS/Linux) .\.venv\Scripts\activate (Windows) |
No es necesario |
| Instalar paquetes | pip install |
uv add |
| Declarar dependencias | requirements.txt o pyproject.toml |
pyproject.toml |
| Versiones bloqueadas | requirements.txt |
uv.lock |
| Gestionar Python | No, solo ejecutables instalados | Sí |
| Ejecutar proyecto | Activar .venv y python main.py |
uv run |
6.1 Si alguien que usa uv quiere reconstruir un ambiente hecho con venv+pip
uv venv
uv pip install -r requirements.txt6.2 Si alguien que no usa uv quiere colaborar en un proyecto uv
python -m venv .venv # usar la versión de python especificada en toml, si no no funciona
soruce .venv/bin/activate # en mac/Linux, en windows .\.venv\Scripts\activate
pip install . # lee desde toml6.3 Si alguien usa uv quiere colaborar
uv sync7 Ideas finales
- La versión de Python y los paquetes son cosas diferentes
- Un ambiente virtual aísla las dependencias de un proyecto
venvcrea el ambiente ypipinstala paquetespyproject.tomlpermite declarar requisitos del proyecto, no es algo propio deuvsino que es un estándar de Pythonuvintegra la gestión de Python, ambientes y dependenciasuv.lockayuda a reproducir las versiones resueltas- Ninguna de estas herramientas, por sí sola, reproduce completamente el sistema operativo
- Ninguna de estas herramientas, por sí sola, hace que nuestro proyecto sea 100% reproducible, esto es solo una capa
Si tienes dudas o comentarios: sporella.dev@gmail.com