Cloud Parts

Poetry

A Python tool, written in Python, that resolves a project’s dependencies into poetry.lock, keeps a virtualenv per project and builds and publishes packages.

Type
Open source
Made by
Poetry project (python-poetry), created by Sébastien Eustace
License
MIT
Facts checked
9 October 2026

What it is

Poetry keeps everything about a project in pyproject.toml. Since Poetry 2.0 (January 2025) that means the standard [project] table; older projects use [tool.poetry]. poetry add pydantic picks a caret range (^2.14.0, written as >=2.14.0,<3.0.0), resolves the whole dependency tree, installs it into the project’s virtualenv (by default under Poetry’s cache directory) and writes the exact versions and file hashes to poetry.lock, which covers every platform at once. Since 2.0 the lockfile also records which dependency group and environment markers each package belongs to. poetry install on another machine installs exactly those versions, poetry build makes wheels and sdists with the poetry-core build backend, and poetry publish uploads them. Development dependencies go into groups; since 2.2 (September 2025) Poetry also reads and writes the standard PEP 735 [dependency-groups] table.

Poetry itself is a Python application and must be installed in its own isolated environment, with pipx or the official installer, never into the project it manages. Version 2.1 added an experimental poetry python install that downloads standalone Python builds. Extras live in plugins: since 2.0, poetry export (which can write pylock.toml since 2.3) and poetry shell are no longer built in. The project is actively maintained; 2.5.0 shipped in September 2026.

Why teams pick it

  • Mature: dependency management, locking, virtualenvs, building and publishing in one tool since 2018
  • One lockfile for every platform, now with groups and markers recorded per package
  • Caught up with the standards: PEP 621 [project] metadata (2.0) and PEP 735 dependency groups (2.2)
  • A plugin system (since 1.2) for features the core leaves out, and projects can declare the plugins they need

Watch out for

  • Resolution can be slow when packages don’t publish their metadata through PyPI’s JSON API: Poetry then downloads them to inspect, and its FAQ admits there is no way around it
  • Being written in Python means installing Poetry into its own environment, separate from the interpreter each project uses
  • Poetry 2.0 broke habits: poetry shell and poetry export moved to plugins and poetry lock stopped updating versions by default
  • poetry.lock is Poetry’s own format; the standard pylock.toml is only available through the export plugin

Alternatives

What all package managers have in common →

How it fits with other technologies

Add dependencies, lock them and reinstall from the lockfile (Poetry 2.4) · bash

poetry new demo && cd demo        # [project] metadata, src layout, poetry-core backend
poetry add pydantic
# Using version ^2.14.0 for pydantic
# Writing lock file
grep pydantic pyproject.toml      #     "pydantic (>=2.14.0,<3.0.0)"

poetry add --group dev ruff       # lands in [dependency-groups] dev (PEP 735)
poetry check --lock               # All set!  (pyproject.toml and poetry.lock agree)

poetry env remove --all && poetry install
# Installing dependencies from lock file
# Package operations: 6 installs, 0 updates, 0 removals
poetry run python -c "import pydantic; print(pydantic.VERSION)"   # 2.14.0

See it in a real stack

No architecture uses Poetry yet. Drop it into the playground and wire it up yourself.Open playground →
Where it came from2018–2026

In 2018 a Python project typically spread its metadata over setup.py, setup.cfg, requirements.txt, MANIFEST.in and, for Pipenv users, a Pipfile. Sébastien Eustace, also the author of the Pendulum datetime library, released Poetry 0.1.0 on 28 February 2018 to replace all of them with a single pyproject.toml, a resolver and a lockfile.

Poetry 1.0 followed in December 2019, with Eustace thanking their employer at the time, PeopleDoc, for time to work on it. Version 1.2 (August 2022) added dependency groups, a new installer and an experimental plugin system, and later releases moved non-core commands such as export into plugins.

As standards for project metadata, dependency groups and lockfiles were adopted, Poetry followed them: the standard [project] table in 2.0 (January 2025), PEP 735 dependency groups in 2.2 (September 2025) and pylock.toml export in 2.3 (January 2026). It now competes with uv, which covers the same ground.

Why it’s built this way

pyproject.toml as the only project file
One file replaced setup.py, setup.cfg, requirements.txt, MANIFEST.in and Pipfile, so dependencies, metadata and build settings could no longer drift apart.
Caret ranges by default
poetry add writes ^2.14.0, allowing any update that keeps the left-most non-zero digit, so projects pick up fixes without accepting the next breaking release.
A lockfile for every platform
poetry.lock is platform-independent, unlike the requirements files pip-tools locks for one platform, so teams on different operating systems share one file.
A small core with plugins
The plugin system (1.2) let users adapt Poetry without forking it, and let the maintainers move commands such as export and shell out of the core in 2.0.

Timeline

  1. 2018

    Poetry 0.1.0, 28 February

  2. 2019

    Poetry 1.0 in December

  3. 2022

    1.2: dependency groups, a new installer and plugins

  4. 2025

    2.0 adopts the standard [project] table; 2.2 adds PEP 735 dependency groups

  5. 2026

    2.3 exports pylock.toml via plugin; 2.5 adds a built-in uninstaller

Sources12 · facts checked 9 October 2026

Improve this page on GitHub