Python Poetry: Guía moderna de gestión de dependencias y empaquetado
Updated on
Gestionar dependencias en Python no debería ser doloroso. Aun así, cualquier desarrollador de Python ha vivido este escenario: clonas un proyecto, ejecutas pip install -r requirements.txt y observas cómo los conflictos de dependencias se encadenan en tu terminal. El paquete A necesita la versión 1.x de una librería, el paquete B necesita la versión 2.x, y pip instala la que termina resolviendo al final, rompiendo silenciosamente uno de ellos. Luego vienen horas de depuración, todo porque pip carece de un resolvedor de dependencias sólido y de un mecanismo de lock file.
Este problema se agrava en entornos de equipo. Un desarrollador fija versiones exactas, otro usa rangos laxos, y un tercero se olvida de actualizar requirements.txt tras instalar un paquete nuevo. Los despliegues fallan. Los tests pasan en local pero se rompen en CI. La causa raíz siempre es la misma: las herramientas por defecto de Python tratan la gestión de dependencias como algo secundario.
Poetry resuelve esto ofreciendo una única herramienta que maneja la resolución de dependencias, la gestión de entornos virtuales y la publicación de paquetes. Utiliza un archivo estándar pyproject.toml, genera lock files deterministas y resuelve conflictos antes de instalar, no después. Esta guía cubre todo: desde la instalación hasta la publicación, con ejemplos prácticos para cada flujo de trabajo.
¿Qué es Python Poetry?
Poetry es una herramienta open-source para la gestión de dependencias y el empaquetado en Python. Creada por Sebastien Eustace en 2018, aborda el estado fragmentado del empaquetado en Python combinando varias funciones en una única herramienta coherente:
- Resolución de dependencias: Poetry analiza todas las dependencias y sus subdependencias para encontrar versiones compatibles antes de instalar nada.
- Lock files: Un archivo
poetry.lockregistra las versiones exactas de cada paquete instalado, garantizando builds reproducibles entre máquinas. - Gestión de entornos virtuales: Poetry crea y gestiona automáticamente entornos virtuales aislados por proyecto.
- Construcción y publicación de paquetes: Poetry construye distribuciones fuente y wheels, y publica directamente en PyPI o en repositorios privados.
- Scaffolding del proyecto: Poetry genera estructuras de proyecto con una configuración
pyproject.tomladecuada.
Poetry usa pyproject.toml como archivo de configuración, siguiendo los estándares PEP 518 y PEP 621. Esto reemplaza la combinación de setup.py, setup.cfg, requirements.txt y MANIFEST.in que los proyectos tradicionales de Python suelen requerir.
Instalación de Poetry
Poetry ofrece su propio instalador que lo aísla de las dependencias de tu proyecto, evitando conflictos de versiones entre el propio Poetry y los paquetes del proyecto.
Instalación recomendada (instalador oficial)
Linux, macOS y Windows (WSL):
curl -sSL https://install.python-poetry.org | python3 -Windows (PowerShell):
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -Tras la instalación, añade Poetry a tu PATH. El instalador imprime la ruta exacta — normalmente $HOME/.local/bin en Linux/macOS o %APPDATA%\Python\Scripts en Windows.
Verifica la instalación:
poetry --versionInstalación con pipx
Si prefieres usar pipx (que también aísla herramientas CLI):
pipx install poetryActualizar Poetry
poetry self updatePara actualizar a una versión específica:
poetry self update 1.8.0Habilitar autocompletado con Tab
Poetry soporta autocompletado para Bash, Zsh y Fish:
# Bash
poetry completions bash >> ~/.bash_completion
# Zsh
poetry completions zsh > ~/.zfunc/_poetry
# Fish
poetry completions fish > ~/.config/fish/completions/poetry.fishCrear un nuevo proyecto
Poetry ofrece dos formas de empezar un proyecto: crear uno desde cero o inicializar Poetry en un proyecto existente.
Nuevo proyecto desde cero
poetry new my-projectEsto genera la siguiente estructura:
my-project/
├── pyproject.toml
├── README.md
├── my_project/
│ └── __init__.py
└── tests/
└── __init__.pyPara un layout de código plano (paquete en la raíz):
poetry new --src my-projectEsto coloca el paquete dentro de un directorio src/:
my-project/
├── pyproject.toml
├── README.md
├── src/
│ └── my_project/
│ └── __init__.py
└── tests/
└── __init__.pyInicializar en un proyecto existente
Navega al directorio de tu proyecto existente y ejecuta:
cd existing-project
poetry initPoetry te guía mediante una configuración interactiva, preguntando el nombre del paquete, versión, descripción, autor, compatibilidad con versiones de Python y dependencias. Puedes pulsar Enter para aceptar valores por defecto u omitir campos opcionales.
Para una configuración no interactiva:
poetry init --name my-package --description "A useful package" --author "Your Name <you@example.com>" --python "^3.9" --no-interactionEntendiendo pyproject.toml
El archivo pyproject.toml es la única fuente de verdad para la configuración de tu proyecto. Aquí tienes un ejemplo completo:
[tool.poetry]
name = "my-project"
version = "1.0.0"
description = "A data processing library"
authors = ["Your Name <you@example.com>"]
license = "MIT"
readme = "README.md"
homepage = "https://github.com/yourname/my-project"
repository = "https://github.com/yourname/my-project"
keywords = ["data", "processing", "analytics"]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries",
]
[tool.poetry.dependencies]
python = "^3.9"
pandas = "^2.0"
requests = "^2.31"
pydantic = ">=2.0,<3.0"
[tool.poetry.group.dev.dependencies]
pytest = "^8.0"
black = "^24.0"
mypy = "^1.0"
ruff = "^0.3"
[tool.poetry.group.docs.dependencies]
sphinx = "^7.0"
sphinx-rtd-theme = "^2.0"
[tool.poetry.scripts]
my-cli = "my_project.cli:main"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"Sintaxis de restricciones de versión
Poetry usa una sintaxis clara para restricciones de versión:
| Restricción | Significado | Permite |
|---|---|---|
^2.0 | Release compatible | >=2.0.0, <3.0.0 |
^2.1.3 | Release compatible (patch) | >=2.1.3, <3.0.0 |
~2.1 | Aproximadamente | >=2.1.0, <2.2.0 |
>=2.0,<3.0 | Rango | Límites explícitos |
2.1.3 | Exacta | Solo 2.1.3 |
>=2.0 | Mínimo | 2.0 en adelante |
* | Cualquiera | Todas las versiones |
La restricción caret (^) es la más común y recomendada. Permite actualizaciones que no cambian el dígito más a la izquierda distinto de cero, siguiendo los principios de semantic versioning.
Grupos de dependencias
Poetry organiza dependencias en grupos, reemplazando la necesidad de archivos requirements separados:
- Dependencias principales (
[tool.poetry.dependencies]): necesarias para que el paquete funcione. Se incluyen cuando alguien instala tu paquete. - Dependencias de desarrollo (
[tool.poetry.group.dev.dependencies]): herramientas para desarrollo, tests y linting. No se incluyen en paquetes publicados. - Grupos personalizados (
[tool.poetry.group.docs.dependencies]): cualquier agrupación adicional que necesites, como herramientas de documentación.
Añadir y eliminar dependencias
Añadir paquetes
Añade un paquete a las dependencias principales:
poetry add pandasAñadir con una restricción de versión:
poetry add "pandas>=2.0,<3.0"Añadir al grupo de desarrollo:
poetry add --group dev pytest black ruffAñadir a un grupo personalizado:
poetry add --group docs sphinxAñadir un paquete desde un repositorio Git:
poetry add git+https://github.com/user/repo.gitAñadir un paquete desde una rama o tag específico:
poetry add git+https://github.com/user/repo.git#branch-name
poetry add git+https://github.com/user/repo.git#v1.0.0Añadir una dependencia por ruta local:
poetry add ../my-local-packageAñadir extras para un paquete:
poetry add "uvicorn[standard]"Eliminar paquetes
Eliminar un paquete:
poetry remove pandasEliminar de un grupo específico:
poetry remove --group dev blackListar paquetes instalados
Ver todos los paquetes instalados:
poetry showVer detalles de un paquete específico:
poetry show pandasMostrar el árbol de dependencias:
poetry show --treeMostrar paquetes desactualizados:
poetry show --outdatedEl lock file: poetry.lock
El archivo poetry.lock es una de las funciones más importantes de Poetry. Cuando ejecutas poetry install o poetry add, Poetry resuelve todas las dependencias y escribe las versiones exactas (incluyendo todas las dependencias transitivas) en poetry.lock.
Por qué importan los lock files
Sin un lock file, ejecutar pip install -r requirements.txt con restricciones de versión laxas puede producir instalaciones diferentes en distintas máquinas o en momentos distintos. Un lock file elimina esa aleatoriedad.
Considera este escenario:
[tool.poetry.dependencies]
requests = "^2.28"Esto permite cualquier versión desde 2.28.0 hasta 2.99.x. Sin un lock file, tu servidor de CI podría instalar 2.31.0 mientras tu máquina local usa 2.28.2. El lock file fija la versión exacta en todos los entornos.
Flujo de trabajo con lock file
Haz commit de poetry.lock en el control de versiones. Esto garantiza que cada desarrollador y despliegue use versiones idénticas de paquetes.
git add poetry.lock pyproject.toml
git commit -m "Add project dependencies"Instala desde el lock file (para instalaciones reproducibles):
poetry installEsto instala exactamente las versiones especificadas en poetry.lock, ignorando versiones compatibles más nuevas.
Actualiza el lock file cuando quieras versiones más recientes:
# Update all packages
poetry update
# Update a specific package
poetry update pandas
# Update the lock file without installing
poetry lockVerifica la integridad del lock file:
poetry lock --checkEsto confirma que el lock file es consistente con pyproject.toml sin modificar nada.
Gestión de entornos virtuales
Poetry crea y gestiona automáticamente entornos virtuales para tus proyectos.
Comportamiento por defecto
Cuando ejecutas poetry install o poetry add, Poetry crea un entorno virtual si no existe. Por defecto, los entornos se guardan en un directorio de caché centralizado:
- Linux:
~/.cache/pypoetry/virtualenvs/ - macOS:
~/Library/Caches/pypoetry/virtualenvs/ - Windows:
C:\Users\<user>\AppData\Local\pypoetry\Cache\virtualenvs\
Entornos virtuales dentro del proyecto
Muchos desarrolladores prefieren el entorno virtual dentro del directorio del proyecto (similar a node_modules en Node.js). Configúralo globalmente:
poetry config virtualenvs.in-project trueEsto crea un directorio .venv en la raíz del proyecto, facilitando encontrarlo y siendo compatible con la autodetección de IDEs.
Ejecutar comandos en el entorno virtual
Ejecutar un único comando:
poetry run python my_script.py
poetry run pytest
poetry run black .Activar el shell del entorno:
poetry shellEsto abre un nuevo shell con el entorno virtual activado. Sal con exit o Ctrl+D.
Información del entorno
Ver detalles del entorno:
poetry env infoListar todos los entornos asociados al proyecto:
poetry env listUsar una versión específica de Python:
poetry env use python3.11Eliminar un entorno:
poetry env remove python3.11Instalación de dependencias
Instalación estándar
Instala todas las dependencias (principales y de desarrollo):
poetry installInstalación para producción
Instalar sin dependencias de desarrollo:
poetry install --without devInstalar sin grupos específicos:
poetry install --without dev,docsInstalar solo grupos específicos
poetry install --only main
poetry install --only devSincronizar el entorno
Eliminar paquetes que no están en el lock file (instalación limpia):
poetry install --syncEsto elimina cualquier paquete instalado manualmente o que ya no esté en el lock file, manteniendo el entorno exactamente alineado con la configuración del proyecto.
Construir y publicar paquetes
Poetry simplifica todo el flujo de publicación de paquetes.
Construir tu paquete
poetry buildEsto crea tanto una distribución fuente (.tar.gz) como una wheel (.whl) en el directorio dist/:
dist/
├── my_project-1.0.0.tar.gz
└── my_project-1.0.0-py3-none-any.whlPublicar en PyPI
Primero, configura tus credenciales de PyPI:
poetry config pypi-token.pypi your-api-tokenLuego publica:
poetry publish --buildEl flag --build construye y publica en un solo paso.
Publicar en un repositorio privado
Añade un repositorio privado:
poetry config repositories.private https://private.pypi.example.com/simple/
poetry config http-basic.private username passwordPublica en él:
poetry publish --repository privateGestión de versiones
Incrementa versiones usando semantic versioning:
poetry version patch # 1.0.0 -> 1.0.1
poetry version minor # 1.0.0 -> 1.1.0
poetry version major # 1.0.0 -> 2.0.0
poetry version prepatch # 1.0.0 -> 1.0.1a0Mostrar la versión actual:
poetry versionMigrar desde requirements.txt
Si tienes un proyecto existente usando requirements.txt, migrar a Poetry es sencillo.
Paso 1: Inicializar Poetry
cd your-project
poetry init --no-interactionPaso 2: Añadir dependencias desde requirements.txt
Para un archivo requirements simple:
cat requirements.txt | xargs poetry addPara archivos con restricciones de versión, añade paquetes manualmente o usa un script de migración:
import subprocess
with open("requirements.txt") as f:
packages = []
for line in f:
line = line.strip()
if line and not line.startswith("#") and not line.startswith("-"):
packages.append(line)
if packages:
subprocess.run(["poetry", "add"] + packages)Paso 3: Añadir dependencias de desarrollo
Si tienes un requirements-dev.txt:
cat requirements-dev.txt | xargs poetry add --group devPaso 4: Verificar y bloquear
poetry install
poetry lock --checkPaso 5: Limpieza
Tras verificar que todo funciona, puedes eliminar los archivos antiguos:
rm requirements.txt requirements-dev.txt setup.py setup.cfgExportar de vuelta a requirements.txt
Si necesitas un requirements.txt por compatibilidad (builds en Docker, sistemas CI legacy):
poetry export -f requirements.txt --output requirements.txtIncluir dependencias de desarrollo:
poetry export -f requirements.txt --with dev --output requirements-dev.txtPoetry vs pip vs pipenv vs uv: Comparación
Elegir la herramienta adecuada de gestión de dependencias depende de los requisitos de tu proyecto. Aquí tienes una comparación detallada:
| Feature | Poetry | pip | pipenv | uv |
|---|---|---|---|---|
| Dependency resolution | Advanced SAT solver | Basic (backtracking since 2020) | Moderate | Advanced, Rust-based |
| Lock file | Yes (poetry.lock) | No (manual pip freeze) | Yes (Pipfile.lock) | Yes (uv.lock) |
| Virtual env management | Automatic | Manual (python -m venv) | Automatic | Automatic |
| Build and publish | Built-in | Requires setuptools/twine | No | Built-in |
| Config file | pyproject.toml | requirements.txt | Pipfile | pyproject.toml |
| Speed | Moderate | Fast (no resolution) | Slow | Very fast (Rust) |
| Python version management | No (use pyenv) | No | No | Yes (built-in) |
| Monorepo support | Limited | N/A | No | Yes |
| Script runners | poetry run | No | pipenv run | uv run |
| Maturity | Established (2018) | Standard library adjacent | Established (2017) | Newer (2024) |
| PEP compliance | PEP 518, 621 | N/A | Proprietary format | PEP 518, 621 |
| Community | Large | Massive | Moderate | Growing fast |
| Best for | Full-lifecycle packaging | Simple scripts, legacy | Web applications | Speed-critical workflows |
Cuándo elegir cada herramienta
Elige Poetry cuando necesitas una solución completa de empaquetado: gestión de dependencias, construcción y publicación en PyPI en una sola herramienta, con un ecosistema maduro y documentación extensa.
Elige pip para scripts simples, prototipado rápido o cuando trabajas con restricciones que requieren las herramientas estándar. Pip sigue siendo la base sobre la que construyen otras herramientas.
Elige pipenv para aplicaciones web donde necesitas entornos reproducibles pero no publicas paquetes en PyPI. Su formato Pipfile separa claramente dependencias de desarrollo y producción.
Elige uv cuando la velocidad de instalación es prioritaria, o quieres una sola herramienta que también gestione versiones de Python. uv está escrito en Rust y resuelve dependencias de forma significativamente más rápida que herramientas basadas en Python. Es compatible con pip y puede servir como reemplazo directo.
Configuración de Poetry y consejos
Opciones de configuración útiles
# Store virtual environments in the project directory
poetry config virtualenvs.in-project true
# Use a specific Python version for new environments
poetry config virtualenvs.prefer-active-python true
# Disable automatic virtual environment creation
poetry config virtualenvs.create false
# View all configuration
poetry config --listPoetry con Docker
Un Dockerfile de producción usando Poetry:
FROM python:3.12-slim
ENV POETRY_VERSION=1.8.0 \
POETRY_HOME="/opt/poetry" \
POETRY_VIRTUALENVS_CREATE=false \
POETRY_NO_INTERACTION=1
RUN pip install poetry==$POETRY_VERSION
WORKDIR /app
COPY pyproject.toml poetry.lock ./
RUN poetry install --without dev --no-root
COPY . .
RUN poetry install --without dev
CMD ["python", "-m", "my_project"]Puntos clave:
POETRY_VIRTUALENVS_CREATE=falseevita crear un entorno virtual dentro del contenedor (el contenedor ya proporciona aislamiento).- Instala dependencias antes de copiar el código fuente para aprovechar el caching por capas de Docker.
- Ejecuta
poetry installdos veces: primero sin el proyecto (solo dependencias), y luego con el proyecto.
Poetry con CI/CD
Ejemplo de GitHub Actions:
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install Poetry
run: pip install poetry
- name: Install dependencies
run: poetry install
- name: Run tests
run: poetry run pytest
- name: Run linting
run: poetry run ruff check .Poetry en flujos de trabajo con Jupyter
Los data scientists suelen trabajar en notebooks de Jupyter, donde la gestión de dependencias es especialmente importante. Poetry se integra bien con Jupyter asegurando que los notebooks usen el entorno correcto.
Instala Jupyter dentro de tu proyecto Poetry:
poetry add --group dev jupyter ipykernelRegistra el entorno de Poetry como un kernel de Jupyter:
poetry run python -m ipykernel install --user --name=my-projectLanza Jupyter desde dentro del entorno Poetry:
poetry run jupyter notebookPara una experiencia de Jupyter más fluida con gestión automática de dependencias y asistencia con IA, RunCell (opens in a new tab) ofrece un entorno integrado donde puedes centrarte en el análisis en lugar de la configuración del entorno. RunCell gestiona automáticamente la instalación de paquetes y la gestión de kernels, lo que complementa el control de dependencias a nivel de proyecto de Poetry.
Referencia de comandos comunes de Poetry
| Command | Description |
|---|---|
poetry new <name> | Create a new project |
poetry init | Initialize in existing directory |
poetry add <pkg> | Add a dependency |
poetry remove <pkg> | Remove a dependency |
poetry install | Install all dependencies |
poetry update | Update dependencies |
poetry lock | Update only the lock file |
poetry show | List installed packages |
poetry show --tree | Show dependency tree |
poetry show --outdated | Show outdated packages |
poetry build | Build the package |
poetry publish | Publish to PyPI |
poetry run <cmd> | Run command in virtual env |
poetry shell | Activate the virtual env shell |
poetry env info | Display environment details |
poetry version <rule> | Bump project version |
poetry export | Export to requirements.txt |
poetry config --list | Show all configuration |
poetry search <pkg> | Search for packages |
poetry check | Validate pyproject.toml |
Resolución de problemas comunes
Fallos en la resolución de dependencias
Problema: Poetry no puede encontrar un conjunto compatible de versiones.
SolverProblemError: ...unable to find compatible versions...Solución: Relaja las restricciones de versión o revisa requisitos en conflicto:
# Show what conflicts exist
poetry show --tree
# Try with a wider constraint
poetry add "problematic-package>=1.0"Resolución lenta
Problema: poetry lock tarda mucho.
Solución: Poetry cachea metadatos de paquetes, pero la primera resolución en un proyecto con muchas dependencias puede ser lenta. Si la resolución supera varios minutos:
# Clear the cache and retry
poetry cache clear --all pypi
# Use verbose output to see what is happening
poetry lock -vvvEl entorno virtual no es detectado por el IDE
Problema: VS Code o PyCharm no encuentra el entorno de Poetry.
Solución: Configura entornos virtuales dentro del proyecto:
poetry config virtualenvs.in-project true
poetry install # Recreates .venv in project rootLuego selecciona .venv/bin/python como intérprete en tu IDE.
Errores de hash mismatch
Problema: poetry install reporta discrepancias de hash.
Solución: Regenera el lock file:
poetry lock --no-updateEsto regenera hashes sin cambiar versiones de dependencias.
FAQ
¿Para qué se usa Python Poetry?
Python Poetry es una herramienta de gestión de dependencias y empaquetado que se encarga de instalar paquetes, resolver conflictos de versiones, gestionar entornos virtuales y publicar paquetes en PyPI. Reemplaza la combinación de pip, venv, setuptools y twine con una herramienta unificada centrada en el archivo de configuración pyproject.toml.
¿Poetry es mejor que pip?
Poetry y pip tienen propósitos distintos. Poetry ofrece resolución de dependencias, lock files, gestión de entornos virtuales y publicación de paquetes en una sola herramienta. Pip es más simple y funciona bien para instalaciones directas. Para proyectos que requieren builds reproducibles, colaboración en equipo o publicación de paquetes, Poetry ofrece ventajas significativas. Para scripts rápidos o proyectos simples, pip sigue siendo suficiente.
¿Cómo cambio de pip a Poetry?
Inicializa Poetry en tu proyecto con poetry init, y luego añade tus dependencias desde requirements.txt usando cat requirements.txt | xargs poetry add. Poetry crea un archivo pyproject.toml y un poetry.lock. Tras verificar que todo funciona con poetry install, puedes eliminar el archivo requirements.txt antiguo. Usa poetry export si aún necesitas requirements.txt por compatibilidad.
¿Poetry reemplaza virtualenv?
Sí. Poetry crea y gestiona automáticamente entornos virtuales para cada proyecto. No necesitas crear o activar entornos manualmente. Poetry guarda los entornos en una caché centralizada por defecto, o en el directorio del proyecto si lo configuras con poetry config virtualenvs.in-project true. Aun así, puedes usar poetry shell para activar el entorno de forma interactiva.
¿Puede Poetry gestionar múltiples versiones de Python?
Poetry en sí no instala versiones de Python, pero funciona con las versiones de Python disponibles en tu sistema. Usa pyenv o uv para instalar múltiples versiones de Python, y luego indica a Poetry cuál usar con poetry env use python3.11. Poetry crea entornos virtuales separados para distintas versiones de Python dentro del mismo proyecto.
¿Cuál es la diferencia entre poetry.lock y requirements.txt?
Un archivo poetry.lock registra cada paquete instalado y su versión exacta, incluyendo todas las dependencias transitivas, junto con hashes de contenido para verificación. Un requirements.txt generado con pip freeze también lista versiones exactas, pero no incluye verificación por hashes ni seguimiento de relaciones de dependencias. El lock file garantiza instalaciones deterministas en todos los entornos, mientras que requirements.txt puede producir resultados diferentes cuando se actualizan dependencias transitivas.
Conclusión
Python Poetry transforma la gestión de dependencias de una fuente de fricción a un flujo de trabajo ágil. Al combinar resolución de dependencias, gestión de entornos virtuales y publicación de paquetes en una sola herramienta, elimina la cadena de herramientas fragmentada que durante mucho tiempo ha frustrado a los desarrolladores de Python. El archivo pyproject.toml ofrece una única fuente de verdad, el lock file garantiza instalaciones reproducibles y el resolvedor de dependencias detecta conflictos antes de que provoquen fallos en runtime.
Tanto si estás construyendo una librería para PyPI, gestionando una aplicación compleja con docenas de dependencias, o colaborando con un equipo que necesita entornos consistentes, Poetry aporta la estructura y fiabilidad que pip por sí solo no puede ofrecer. Su curva de aprendizaje es moderada — la mayoría de desarrolladores se vuelven productivos en menos de una hora — y el tiempo ahorrado depurando dependencias se amortiza durante la primera semana.
Empieza ejecutando poetry new en tu próximo proyecto o poetry init en uno existente. Añade tus dependencias, haz commit del lock file y vive una gestión de dependencias como debería ser. Para flujos de trabajo de data science en Jupyter, combina el control de dependencias a nivel de proyecto de Poetry con RunCell (opens in a new tab) para un entorno que gestiona tanto el package management como el análisis interactivo de forma fluida.