Una de las grandes fortalezas de Python es su ecosistema: cientos de miles de paquetes listos para instalar y usar. Pero instalar paquetes "a lo loco" en el Python del sistema acaba, tarde o temprano, en conflictos de versiones y proyectos rotos. En esta lección aprenderás la solución profesional: los entornos virtuales (venv), que aíslan las dependencias de cada proyecto, y pip, el gestor de paquetes de Python, junto con el fichero requirements.txt que permite reproducir un entorno en cualquier máquina. Configurar esto ahora, aunque el proyecto Papyrus todavía no necesite paquetes externos, te dará el hábito correcto desde el primer día.
Contenido
- El problema: dependencias compartidas y conflictos
- Qué es un entorno virtual
- Crear, activar y desactivar un entorno con
venv - pip: instalar, listar y desinstalar paquetes
requirements.txt: entornos reproducibles- Buenas prácticas
- Alternativas que conviene conocer: conda y poetry
El problema: dependencias compartidas y conflictos
Imagina este escenario, muy real:
- Para el proyecto Papyrus instalas un paquete de informes, versión 2.0.
- Meses después, para otro proyecto, necesitas el mismo paquete pero en versión 3.0 (con cambios incompatibles).
- Si ambos proyectos comparten la misma instalación de Python, no pueden convivir: actualizar rompe Papyrus; no actualizar bloquea el proyecto nuevo.
A esto se le llama coloquialmente dependency hell (el infierno de las dependencias). Y tiene un segundo frente: si instalas todo en el Python del sistema operativo, puedes incluso interferir con herramientas del propio sistema que dependen de él (algunos Linux directamente lo bloquean con un error externally-managed-environment).
La solución es conceptualmente simple: que cada proyecto tenga su propia copia aislada del entorno de Python, con sus propios paquetes y versiones.
flowchart TB
subgraph Sistema
P["Python del sistema\n(limpio, sin paquetes de proyectos)"]
end
subgraph "Proyecto Papyrus"
V1[".venv\npaquete-informes 2.0"]
end
subgraph "Otro proyecto"
V2[".venv\npaquete-informes 3.0"]
end
P -.crea.-> V1
P -.crea.-> V2
Qué es un entorno virtual
Un entorno virtual es una carpeta dentro de tu proyecto que contiene:
- Una copia (o enlace) del intérprete de Python.
- Su propia carpeta de paquetes instalados, independiente de la del sistema y de la de otros entornos.
- Scripts de activación que "redirigen" temporalmente los comandos
pythonypiphacia ese entorno.
Puntos clave para entenderlo bien:
- No es una máquina virtual ni nada pesado: es básicamente una carpeta con ficheros. Crear uno tarda segundos.
- Mientras un entorno está activado, todo lo que instales con
pipcae dentro de él, sin tocar nada más. - Si un entorno se estropea, se borra la carpeta y se crea otro. Nada del sistema se ve afectado.
La herramienta estándar para crearlos, venv, viene incluida con Python 3: no hay que instalar nada.
Crear, activar y desactivar un entorno con venv
Crear
Sitúate en la carpeta de tu proyecto (la carpeta papyrus que creaste en la lección 01-02) y ejecuta:
Desglose del comando:
python -m venv— ejecuta el módulovenvque trae Python (-msignifica "ejecuta este módulo"; entenderás mejor los módulos en el módulo 3 del curso)..venv— el nombre de la carpeta donde se creará el entorno. Es el nombre convencional más extendido (el punto inicial la marca como carpeta "de trabajo interno"); también verásvenvoenv.
Tras unos segundos tendrás una carpeta .venv dentro del proyecto. No edites nada dentro de ella: es territorio de las herramientas.
Activar
Activar el entorno significa que, en esa terminal, python y pip pasan a ser los del entorno. El comando depende del sistema:
| Sistema y shell | Comando de activación |
|---|---|
| Windows — PowerShell | .venv\Scripts\Activate.ps1 |
| Windows — CMD (Símbolo del sistema) | .venv\Scripts\activate.bat |
| macOS / Linux — bash o zsh | source .venv/bin/activate |
En Windows (PowerShell):
En macOS/Linux:
La señal inequívoca de que está activo es el prefijo (.venv) en el prompt de la terminal. A partir de ese momento:
(.venv) $ python --version # el Python del entorno
(.venv) $ pip --version # el pip del entorno (instala DENTRO de .venv)Nota para Windows/PowerShell: si al activar aparece un error sobre "ejecución de scripts deshabilitada", ejecuta una vez
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUsery vuelve a intentarlo. Es una protección de PowerShell, no un fallo de Python.
Nota para VS Code: al abrir la carpeta del proyecto, VS Code suele detectar
.venvy preguntar si quieres usarlo como intérprete. Di que sí: así el editor y su terminal integrado usarán el entorno automáticamente. Si no pregunta, pulsaCtrl+Shift+P→ "Python: Select Interpreter" y elige el de.venv.
Desactivar
Para volver al Python del sistema en esa terminal:
El prefijo desaparece. El entorno no se borra: solo deja de estar activo. La próxima vez que trabajes en el proyecto, vuelves a activarlo. Y si algún día quieres eliminarlo de verdad, basta con borrar la carpeta .venv.
Ciclo de trabajo diario resumido:
flowchart LR
A["cd papyrus"] --> B["Activar .venv"]
B --> C["Trabajar:\npython, pip..."]
C --> D["deactivate\n(o cerrar la terminal)"]
D -.al día siguiente.-> A
pip: instalar, listar y desinstalar paquetes
pip es el gestor de paquetes de Python: descarga paquetes del repositorio oficial PyPI (Python Package Index, https://pypi.org, con cientos de miles de paquetes publicados) y los instala en el entorno activo.
Con el entorno .venv activado, los comandos esenciales:
Instalar un paquete
(cowsay es un paquete de broma, perfecto para practicar sin riesgo: hace que una vaca de texto "diga" cosas.) pip descarga el paquete y sus dependencias y los instala en .venv. Probémoslo:
_____________________
| Bienvenidos a Papyrus |
=====================
\
\
^__^
(oo)\_______
(__)\ )\/\
||----w |
|| ||La sentencia import (que estudiarás a fondo en el módulo 3) es la forma de usar un paquete instalado desde tu código.
También puedes instalar una versión concreta, algo clave para la reproducibilidad:
Ver qué hay instalado
Y para el detalle de un paquete concreto (versión, resumen, dependencias):
Congelar versiones
pip freeze es como pip list, pero en formato "reinstalable" (paquete==versión). Es la base del requirements.txt que viene ahora.
Desinstalar
pip pedirá confirmación (y) y eliminará el paquete del entorno.
| Comando | Para qué sirve |
|---|---|
pip install <paquete> |
Instalar la última versión |
pip install <paquete>==X.Y |
Instalar una versión exacta |
pip list |
Listar lo instalado, en formato tabla |
pip show <paquete> |
Detalles de un paquete instalado |
pip freeze |
Listar lo instalado en formato paquete==versión |
pip uninstall <paquete> |
Desinstalar |
requirements.txt: entornos reproducibles
Imagina que compartes el proyecto Papyrus con otra persona (o con tu ordenador de dentro de un año). La carpeta .venv no se comparte (es pesada y específica de cada máquina); lo que se comparte es la lista de dependencias: el fichero requirements.txt.
Generarlo
Con el entorno activado y los paquetes que uses instalados:
El símbolo > redirige la salida del comando al fichero. El resultado es un fichero de texto en la raíz del proyecto:
Cada línea es un paquete con su versión exacta ("congelada"): la garantía de que otro entorno instalará exactamente lo mismo.
Usarlo para recrear el entorno
Quien reciba el proyecto (o tú mismo en otra máquina) solo necesita:
cd papyrus
python -m venv .venv
# ...activar el entorno según su sistema...
pip install -r requirements.txtLa opción -r significa "instala todo lo que lista este fichero". En tres comandos, un entorno idéntico al original.
Flujo completo del proyecto
flowchart LR
A["pip install paquete"] --> B["pip freeze > requirements.txt"]
B --> C["Compartir el proyecto\n(sin la carpeta .venv)"]
C --> D["python -m venv .venv\n+ activar"]
D --> E["pip install -r requirements.txt"]
Mantén requirements.txt actualizado: cada vez que instales o desinstales un paquete relevante para el proyecto, vuelve a ejecutar pip freeze > requirements.txt.
Buenas prácticas
- Un entorno virtual por proyecto, siempre. Aunque el proyecto sea pequeño. Crear un
.venvcuesta 10 segundos; deshacer un lío de versiones cuesta tardes enteras. - No instales paquetes en el Python del sistema. El Python "global" debe quedarse limpio, solo para crear entornos. Si alguna vez ejecutas
pip instally no ves(.venv)en el prompt, detente y activa el entorno. - La carpeta del entorno se llama
.venvy vive en la raíz del proyecto. Es la convención que las herramientas (VS Code incluido) detectan automáticamente. requirements.txtsí se comparte;.venvno. Si usas git, añade.venv/al fichero.gitignoredel proyecto para que no se suba al repositorio.- No edites nada dentro de
.venv. Se regenera, no se repara: ante cualquier problema extraño, borra la carpeta y recréala desderequirements.txt. - Comprueba dónde estás instalando.
pip --versionmuestra la ruta del pip activo; si apunta dentro de tu proyecto, todo correcto. - Fija versiones en proyectos serios.
pip freezecon==garantiza que el proyecto funcione igual dentro de seis meses, aunque los paquetes hayan publicado versiones nuevas.
Alternativas que conviene conocer: conda y poetry
venv + pip es el equipamiento estándar y es todo lo que necesitas en este curso. Pero en el mundo real oirás hablar de otras herramientas, y conviene que te suenen:
| Herramienta | Qué aporta | Cuándo la verás |
|---|---|---|
venv + pip |
El estándar incluido con Python. Simple y universal. | Este curso y la mayoría de proyectos |
| conda | Gestor de entornos y paquetes orientado a ciencia de datos; instala también dependencias no-Python (librerías de cálculo compiladas). | Entornos científicos y de análisis de datos |
| poetry | Gestión de dependencias moderna con ficheros pyproject.toml, resolución avanzada de versiones y empaquetado del proyecto. |
Proyectos profesionales y librerías publicadas |
No las estudiaremos en este curso: todo lo que hagamos funciona con venv y pip. Si más adelante un equipo o tutorial usa conda o poetry, los conceptos que acabas de aprender (entorno aislado, lista de dependencias, versiones fijadas) son exactamente los mismos; solo cambian los comandos.
Errores Comunes y Consejos
- Instalar sin activar el entorno: el error más frecuente. El paquete acaba en el Python del sistema y "misteriosamente" tu proyecto no lo encuentra (o al revés). Mira siempre el prefijo
(.venv)antes de unpip install. - Abrir una terminal nueva y olvidar reactivar: la activación es por terminal y por sesión. Terminal nueva (o reiniciada) = volver a activar.
ModuleNotFoundError: No module named '...'al ejecutar tu script: casi siempre significa que el paquete está instalado en otro entorno (o en ninguno), o que VS Code está usando un intérprete distinto al de tu.venv. Revisa "Python: Select Interpreter".- Error de "ejecución de scripts deshabilitada" en PowerShell: aplica el
Set-ExecutionPolicyindicado en el apartado de activación; es cosa de PowerShell, no de tu instalación. - Subir
.venva git o enviarla por correo: es pesada e inútil fuera de tu máquina. Lo portable esrequirements.txt. - Renombrar o mover la carpeta
.venv: los entornos contienen rutas absolutas internas y dejan de funcionar. Si necesitas moverlo: borrar y recrear (conrequirements.txtson dos comandos). - Consejo: crea ya el entorno de tu carpeta
papyrusy actívalo cada vez que trabajes en el curso, aunque de momento no instales casi nada. Cuando en los módulos 10 y 11 instalemos Flask, pandas y compañía, el hábito ya estará hecho.
Ejercicios
Ejercicio 1
En la carpeta papyrus de tu proyecto: crea un entorno virtual llamado .venv, actívalo, comprueba con pip list que está (casi) vacío y desactívalo. Anota los comandos exactos que has usado en tu sistema operativo.
Ejercicio 2
Con el entorno de Papyrus activado: instala el paquete cowsay, comprueba con pip show cowsay qué versión tienes, genera el requirements.txt del proyecto y muestra su contenido por terminal.
Ejercicio 3
Simula el "traspaso" del proyecto: desactiva y borra la carpeta .venv completa (tranquilo: para eso está el ejercicio), y reconstruye el entorno desde cero usando únicamente requirements.txt. Termina comprobando con pip list que cowsay volvió a instalarse.
Soluciones
Solución 1
En Windows (PowerShell):
En macOS/Linux:
pip list en un entorno recién creado muestra únicamente pip (y en algunas versiones, setuptools): esa es la prueba de que el entorno está limpio y aislado.
Solución 2
Con (.venv) visible en el prompt:
Para ver el contenido del fichero: type requirements.txt en Windows o cat requirements.txt en macOS/Linux. Debe contener algo como:
Solución 3
Borrar la carpeta: Remove-Item -Recurse -Force .venv en PowerShell (o eliminarla desde el explorador de archivos), rm -rf .venv en macOS/Linux. Después, reconstrucción:
python -m venv .venv
# activar según el sistema (ver solución 1)
pip install -r requirements.txt
pip listpip list vuelve a mostrar cowsay en la versión exacta anotada en requirements.txt. Acabas de demostrar la idea central de la lección: el entorno es desechable; la lista de dependencias es lo valioso.
Conclusión
Con esta lección cierras el módulo de introducción equipado como un profesional: sabes por qué se aíslan las dependencias, creas y gestionas entornos con venv (crear, activar según sistema, desactivar), manejas pip (install, list, show, freeze, uninstall) y haces tus proyectos reproducibles con requirements.txt, siguiendo las buenas prácticas de un entorno por proyecto y un Python de sistema siempre limpio. También te suenan ya conda y poetry, las alternativas que encontrarás ahí fuera.
El proyecto Papyrus tiene ahora todo lo que necesita: un entorno de desarrollo completo, sus primeros scripts (bienvenida, catálogo, ficha interactiva de libros) y un entorno virtual listo para crecer. En el próximo módulo, Estructuras de Control, tus programas empezarán a tomar decisiones y a repetir tareas: condicionales para saber si hay stock, bucles para recorrer el catálogo entero, y mucho más. Ahí es donde la programación empieza a sentirse como un superpoder.
Curso de Programación en Python
Módulo 1: Introducción a Python
- Introducción a Python
- Configuración del Entorno de Desarrollo
- Sintaxis de Python y Tipos de Datos Básicos
- Variables y Constantes
- Entrada y Salida Básica
- Entornos Virtuales y Gestión de Paquetes
Módulo 2: Estructuras de Control
- Sentencias Condicionales
- Bucles: for y while
- Herramientas de Control de Flujo
- Comprensiones de Listas
Módulo 3: Funciones y Módulos
- Definición de Funciones
- Argumentos de Función
- Funciones Lambda
- Módulos y Paquetes
- Visión General de la Biblioteca Estándar
Módulo 4: Estructuras de Datos
Módulo 5: Programación Orientada a Objetos
Módulo 6: Manejo de Archivos
- Lectura y Escritura de Archivos
- Trabajo con Archivos CSV
- Manejo de Datos JSON
- Operaciones con Archivos y Directorios
Módulo 7: Manejo de Errores y Excepciones
- Introducción a las Excepciones
- Manejo de Excepciones
- Lanzamiento de Excepciones
- Excepciones Personalizadas
- Buenas Prácticas y Registro de Errores con logging
Módulo 8: Temas Avanzados
- Anotaciones de Tipos (type hints)
- Decoradores
- Generadores
- Administradores de Contexto
- Concurrencia: Hilos y Procesos
- Asyncio para Programación Asíncrona
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con unittest
- Pruebas con pytest
- Desarrollo Guiado por Pruebas
- Técnicas de Depuración
- Uso de pdb para Depuración
Módulo 10: Desarrollo Web con Python
- Introducción al Desarrollo Web
- Fundamentos del Framework Flask
- Construcción de APIs REST con Flask
- Introducción a Django
- Construcción de Aplicaciones Web con Django
Módulo 11: Ciencia de Datos con Python
- Introducción a la Ciencia de Datos
- NumPy para Computación Numérica
- Pandas para Manipulación de Datos
- Matplotlib para Visualización de Datos
- Introducción al Aprendizaje Automático con scikit-learn
