Skip to content

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.

Learn More

Last updated on