Файл constraints.txt ограничивает версии пакетов, которые resolver уже должен установить по требованиям проекта. Сам он не добавляет зависимость. Это ключевое различие с requirements.txt.

Примените два файла вместе

Основной список отвечает на вопрос, что нужно окружению, а constraint задает допустимые границы для выбранных прямых и транзитивных пакетов во всех сервисах команды.

python -m pip install -r requirements.txt -c constraints.txt

Что разрешено в constraint

Строка должна содержать имя проекта и ограничение версии, зато editable-ссылки, extras и безымянные URL здесь запрещены, поскольку файл управляет кандидатами resolver, а не источниками установки.

Не превращайте файл в свалку

Добавляйте ограничение с причиной, ссылкой на несовместимость и сроком пересмотра, иначе старый верхний предел переживет исправление библиотеки и заблокирует безопасное обновление.

После каждого изменения создавайте пустой venv и повторяйте полную установку: уже установленное окружение способно скрыть ошибку нового ограничения.

Готовый набор можно перенести в офлайн-каталог wheelhouse. Семантику файла объясняет руководство pip.