Does Poetry Support Python Standards for Dependency Management?
Poetry 2.0 added support for the PEP 621 project metadata standard. Before that release, Poetry stored all project information under its proprietary [tool.poetry] table, making it unreadable by other build tools without Poetry installed.
What the standard format covers
The [project] table in pyproject.toml now handles the metadata that [tool.poetry] originally owned:
[project]
name = "my-package"
version = "1.0.0"
description = "A short description."
requires-python = ">=3.11"
dependencies = [
"requests>=2.28",
"httpx>=0.24",
]
[project.optional-dependencies]
dev = ["pytest>=8.0"]This format is readable by any PEP 621-compliant tool: uv, Hatchling, flit, and others. Note that [project.dependencies] uses PEP 508 dependency specifiers (requests>=2.28) rather than Poetry’s caret syntax (requests = "^2.28").
Which features still need [tool.poetry]
Not every Poetry feature has a standard equivalent. These remain Poetry-specific:
- Package discovery.
packages = [{include = "..."}]controls which Python packages the build includes and excludes. - Source configuration.
[[tool.poetry.source]]points to private registries. - Minimum Poetry version.
requires-poetry = ">=2.0"pins the Poetry version a project requires. - Plugin requirements.
[tool.poetry.requires-plugins]declares Poetry plugins the project depends on.
A project can use both tables at once: standard metadata in [project], Poetry-specific options in [tool.poetry].
Why the format choice matters
A Poetry project using [project] for its metadata can be read by other tools without Poetry installed. CI pipelines that call uv build or pip install . work without Poetry. Developers can inspect or update dependencies using any PEP 621-aware editor or tool.
Projects locked into [tool.poetry] alone require Poetry-aware tooling at every step in the build and install chain.