¿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