Back to results for “Modules & Packaging”
Python › Modules & Packaging

What is the purpose of a `requirements.txt` file, and how does it differ from dependency declarations in pyproject.toml?

Intermediate

Answer

requirements.txt lists exact package versions to install via `pip install -r requirements.txt`, traditionally used for reproducible environments (especially pinned/locked versions from `pip freeze`). pyproject.toml's [project.dependencies] instead declares a package's abstract dependency requirements (often with version ranges) as part of its distributable metadata -- requirements.txt is often still used alongside it for locking exact versions in deployment or CI environments.
# requirements.txt (exact pins for reproducibility)
requests==2.31.0
click==8.1.7

# pyproject.toml (abstract ranges for a distributable package)
[project]
dependencies = ["requests>=2.28", "click>=8.0"]
Real-world example A team's CI pipeline installs from a pinned requirements.txt (generated via pip-compile) for exact reproducibility, while the package's pyproject.toml declares looser version ranges for compatibility with downstream consumers.

Common follow-ups: What is pip-tools and how does pip-compile generate lock files?;How do tools like Poetry unify both concerns?