TechLead
Lección 12 de 25
5 min de lectura
Python

Entornos virtuales y pip

Aprende a gestionar dependencias de Python con entornos virtuales, pip y herramientas modernas de empaquetado

¿Por que entornos virtuales?

Los entornos virtuales crean instalaciones aisladas de Python para cada proyecto. Sin ellos, todos los proyectos comparten los mismos paquetes globales, lo que lleva a conflictos de versiones. Por ejemplo, el Proyecto A podria necesitar Django 4.2 mientras que el Proyecto B necesita Django 5.0. Los entornos virtuales resuelven esto dando a cada proyecto su propio directorio de paquetes.

El problema de las dependencias

Sin entornos virtuales, instalar paquetes globalmente lleva a:

  • Conflictos de version: Dos proyectos necesitando diferentes versiones del mismo paquete
  • Problemas de reproducibilidad: No se puede garantizar el mismo entorno en otra maquina
  • Contaminacion del sistema: Paquetes globales desordenando tu Python del sistema
  • Problemas de permisos: Necesitar sudo para instalar paquetes globalmente

Creacion y uso de entornos virtuales

# Create a virtual environment using venv (built into Python 3.3+)
# python3 -m venv myproject-env

# Activate the virtual environment
# On macOS/Linux:
# source myproject-env/bin/activate

# On Windows:
# myproject-env\Scripts\activate

# Your prompt changes to show the active environment:
# (myproject-env) $

# Install packages (they go into the virtual environment, not globally)
# pip install requests flask sqlalchemy

# Check where Python and pip are located
# which python  -> /path/to/myproject-env/bin/python
# which pip     -> /path/to/myproject-env/bin/pip

# Deactivate when done
# deactivate

# Common convention: name the venv directory .venv
# python3 -m venv .venv
# source .venv/bin/activate

# Add .venv to .gitignore!

pip - El instalador de paquetes

# Install a package
# pip install requests

# Install a specific version
# pip install requests==2.31.0

# Install with version constraints
# pip install "requests>=2.28,<3.0"

# Upgrade a package
# pip install --upgrade requests

# Uninstall a package
# pip uninstall requests

# List installed packages
# pip list

# Show package details
# pip show requests

# Freeze current environment to requirements.txt
# pip freeze > requirements.txt

# Install from requirements.txt
# pip install -r requirements.txt

# Search for packages (use PyPI website instead)
# https://pypi.org/search/

requirements.txt

# requirements.txt - pin exact versions for reproducibility
# requests==2.31.0
# flask==3.0.2
# sqlalchemy==2.0.25
# pydantic==2.5.3

# requirements-dev.txt - development dependencies
# -r requirements.txt   # include production deps
# pytest==7.4.4
# black==24.1.1
# mypy==1.8.0
# ruff==0.1.14

# Use separate files for different environments:
# requirements.txt       - production
# requirements-dev.txt   - development
# requirements-test.txt  - testing

Herramientas modernas: uv y Poetry

Mientras que venv y pip funcionan bien, herramientas modernas como uv (de Astral, los creadores de Ruff) y Poetry proporcionan mejor resolucion de dependencias, archivos de bloqueo y gestion de proyectos.

# uv - extremely fast Python package manager
# Install uv:
# curl -LsSf https://astral.sh/uv/install.sh | sh

# Create a project
# uv init myproject
# cd myproject

# Add dependencies
# uv add requests flask

# Add dev dependencies
# uv add --dev pytest ruff

# Run your project
# uv run python main.py

# Sync dependencies (install from lock file)
# uv sync

# uv is 10-100x faster than pip!

# Poetry - dependency management and packaging
# Install: curl -sSL https://install.python-poetry.org | python3 -

# Create a new project
# poetry new myproject

# Add dependencies
# poetry add requests
# poetry add --group dev pytest

# Install all dependencies
# poetry install

# Run commands in the virtual environment
# poetry run python main.py
# poetry shell  # Activate the virtual environment

pyproject.toml

El archivo pyproject.toml es el estandar moderno para la configuracion de proyectos Python. Reemplaza setup.py, setup.cfg y requirements.txt con un unico archivo estandarizado.

# pyproject.toml
# [project]
# name = "myproject"
# version = "1.0.0"
# description = "My awesome Python project"
# requires-python = ">=3.11"
# dependencies = [
#     "requests>=2.28",
#     "flask>=3.0",
#     "sqlalchemy>=2.0",
# ]
#
# [project.optional-dependencies]
# dev = [
#     "pytest>=7.0",
#     "ruff>=0.1",
#     "mypy>=1.0",
# ]
#
# [tool.ruff]
# line-length = 100
# target-version = "py311"
#
# [tool.pytest.ini_options]
# testpaths = ["tests"]

Puntos clave

  • Siempre usa entornos virtuales: Nunca instales paquetes globalmente
  • Fija versiones: Usa versiones exactas en requisitos de produccion
  • Prueba uv: Es dramaticamente mas rapido que pip para gestion de paquetes
  • Usa pyproject.toml: El estandar moderno para configuracion de proyectos Python

Continuar Aprendiendo