Файл constraints.txt ограничивает версии пакетов, которые resolver уже должен установить по требованиям проекта. Сам он не добавляет зависимость. Это ключевое различие с requirements.txt.
Примените два файла вместе
Основной список отвечает на вопрос, что нужно окружению, а constraint задает допустимые границы для выбранных прямых и транзитивных пакетов во всех сервисах команды.
python -m pip install -r requirements.txt -c constraints.txt
Что разрешено в constraint
Строка должна содержать имя проекта и ограничение версии, зато editable-ссылки, extras и безымянные URL здесь запрещены, поскольку файл управляет кандидатами resolver, а не источниками установки.
Не превращайте файл в свалку
Добавляйте ограничение с причиной, ссылкой на несовместимость и сроком пересмотра, иначе старый верхний предел переживет исправление библиотеки и заблокирует безопасное обновление.
После каждого изменения создавайте пустой venv и повторяйте полную установку: уже установленное окружение способно скрыть ошибку нового ограничения.
Готовый набор можно перенести в офлайн-каталог wheelhouse. Семантику файла объясняет руководство pip.