Python requirements.txt: создание и применение

Раздел: Управление окружением -> Управление зависимостями

Основы работы с requirements.txt

Как наиболее эффективно зафиксировать и восстановить окружение Python?

Для быстрой фиксации всех установленных пакетов с точными версиями используется команда pip freeze > requirements.txt. Этот файл содержит одну строку на пакет в формате пакет==версия. Пример:

$ pip freeze > requirements.txt

Installing python modules (установка модулей python)

Contents of requirements.txt:
Django==4.2.7
requests==2.31.0
numpy==1.24.3
...

Python requirements (файл requirements.txt в python)

Для установки зависимостей из файла выполняется pip install -r requirements.txt. Перед этим рекомендуется создать и активировать виртуальное окружение, чтобы избежать конфликтов с системными пакетами.

Типичные ошибки:

  • Установка без виртуального окружения может изменить глобальные пакеты.
  • Команда pip freeze захватывает все пакеты, включая неявные зависимости, что может привести к излишнему списку.
  • Различия в платформе (Windows, Linux) могут требовать корректировки записей.

Использовать pip freeze следует только для точной репликации окружения, а не для формирования минимального набора зависимостей.

Как создать файл требований вручную для контроля версий?

Ручное создание requirements.txt позволяет задавать только прямые зависимости и указывать гибкие версионные ограничения. Формат строки: имя_пакета[экстра] [оператор_версии] [версия]. Поддерживаются операторы ==, >=, <=, !=, ~= (совместимая версия), а также < и >. Пример:

# requirements.txt (ручное составление)
Django>=4.2,<5.0
requests==2.31.*
numpy~=1.24
pandas[all]==2.0.3

Python requirements file (файл requirements.txt в python)

Установка выполняется так же: pip install -r requirements.txt.

Проблемы: при использовании >= высока вероятность получить несовместимые версии позже. Рекомендуется закреплять минорные версии через ~= или указывать точные версии.

Как использовать pipenv для управления зависимостями?

Pipenv создаёт файлы Pipfile (список зависимостей) и Pipfile.lock (зафиксированные версии). Для генерации requirements.txt из него используется команда pipenv requirements.

$ pipenv install requests
$ pipenv requirements > requirements.txt

Python get requirements (получение списка зависимостей requirements.txt в python)

Contents of requirements.txt:
requests==2.31.0
certifi==2023.7.22
charset-normalizer==3.3.0
...

сделать requirements python (создание requirements.txt для python)

Также можно экспортировать только прямые зависимости: pipenv requirements --dev-only.

Если в проекте используется Pipfile, а не requirements.txt, то другие разработчики могут быть незнакомы с pipenv. Экспорт в requirements.txt решает эту проблему.

Как использовать poetry для фиксации зависимостей?

Poetry использует pyproject.toml для описания зависимостей и poetry.lock для блокировки версий. Экспорт в requirements.txt осуществляется командой poetry export.

$ poetry export -f requirements.txt --output requirements.txt
$ poetry export --without-hashes > requirements.txt

Python uv install (установка пакетов с помощью uv в python)

Contents of requirements.txt:
requests==2.31.0; python_version >= "3.7"
certifi==2023.7.22; python_version >= "3.7"
...

Requests python versions (проверка версии библиотеки requests в python)

Опция --without-hashes убирает хэши, упрощая установку.

При использовании poetry с проектом, где уже есть requirements.txt, может возникнуть конфликт версий между файлами. Рекомендуется синхронизировать через poetry add и экспорт.

Как разделить зависимости на production и development?

Можно создать два файла: requirements-prod.txt и requirements-dev.txt. В dev-файле подключать prod через -r и добавлять свои пакеты.

# requirements-prod.txt
Django==4.2.7
gunicorn==21.2.0

# requirements-dev.txt
-r requirements-prod.txt
pytest==7.4.3
black==23.10.1

проверить библиотеки python (проверка установленных библиотек python)

Установка dev-окружения: pip install -r requirements-dev.txt.

Необходимо следить за актуальностью обоих файлов. Лучше автоматизировать сборку через CI/CD.

Как использовать pip-tools для гибкого управления?

Инструменты pip-compile и pip-sync позволяют создавать requirements.txt из файла requirements.in с разрешением зависимостей. Входной файл содержит только прямые зависимости с любыми ограничениями, а выходной - полный список с точными версиями.

# requirements.in
Django>=4.2
requests

$ pip-compile requirements.in --output-file requirements.txt

No matching distribution found for python (решение ошибки «no matching distribution found» при установке пакетов python)

# This file is autogenerated by pip-compile
# To update, run:
#    pip-compile requirements.in
#
Django==4.2.7
    # via -r requirements.in
asgiref==3.7.2
    # via django
requests==2.31.0
    # via -r requirements.in
... (с указанием транзитивных зависимостей)

Python файл requirements (файл requirements.txt в python)

Команда pip-sync приводит текущее окружение к состоянию, описанному в requirements.txt.

Если вручную изменялся requirements.txt, то при следующем pip-compile изменения могут быть потеряны. Работать следует только с requirements.in.

Как зафиксировать зависимости для конкретной платформы?

В файле можно использовать маркеры окружения (environment markers), чтобы указывать пакеты только для определённых ОС или версий Python. Например:

pywin32==305; sys_platform == 'win32'
pyobjc==9.2; sys_platform == 'darwin'
cryptography==41.0.3; python_version < '3.12'

Установка с такими маркерами корректно отрабатывает на любой платформе.

Не все старые версии pip поддерживают маркеры. Рекомендуется обновить pip до последней версии.

Расширенные примеры работы с requirements.txt

Пример 1: Создание requirements.txt с хэшами для безопасной установки

Для обеспечения целостности пакетов можно включить в файл хэши (SHA256). Pip поддерживает режим --require-hashes, при котором установка возможна только при совпадении всех хэшей.

Пример
# Сначала создадим обычный requirements.txt, затем добавим хэши вручную
# или используем pip freeze с опцией --hash
$ pip freeze --all --hash > requirements.txt
Contents of requirements.txt (фрагмент):
Django==4.2.7 \
    --hash=sha256:6d0b3b2b5e5b8c7c0c3b0a5b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3 \
    --hash=sha256:9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5

Установка с проверкой хэшей:

Пример
$ pip install --require-hashes -r requirements.txt

Если хотя бы один хэш не совпадет, pip выдаст ошибку и откатит установку.

При автоматической генерации хэшей через pip freeze могут быть пропущены некоторые пакеты. Рекомендуется использовать специализированные инструменты (pip-tools, poetry) для генерации полного списка с хэшами.

Пример 2: Указание дополнительных индексов пакетов

Если проект использует пакеты из приватного индекса (например, Nexus или Artifactory), можно указать дополнительный URL через --extra-index-url в файле.

Пример
# requirements.txt
--extra-index-url https://private.example.com/simple
my-private-package==1.0.0
requests==2.31.0

# Альтернативный способ: задать в pip.conf или переменной окружения PIP_EXTRA_INDEX_URL

Установка выполняется обычной командой pip install -r requirements.txt.

Если основной индекс (PyPI) и дополнительный содержат одинаковые пакеты, может возникнуть путаница с версиями. Рекомендуется явно указывать --index-url для переопределения основного репозитория.

Пример 3: Использование файлов ограничений (constraints)

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

Пример
# constraints.txt
Django<5.0
numpy>=1.20,!=1.24.0

# requirements.txt (только прямые зависимости)
requests
pandas

Установка с ограничениями:

Пример
$ pip install -r requirements.txt -c constraints.txt

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

Если ограничения противоречат друг другу, pip выдаст ошибку о неразрешимых зависимостях. Рекомендуется проверять совместность ограничений с помощью pip check.

Пример 4: Установка пакетов из Git-репозиториев или локальных путей

Файл requirements.txt поддерживает установку из различных источников. Для Git используется протокол git+https или git+ssh.

Пример
# requirements.txt
git+https://github.com/user/repo.git@v1.0.0#egg=my-package
-e ./local-package
-e . # editable install текущего проекта
-e git+ssh://git@example.com:user/package.git#egg=package-name

Флаг -e (editable) устанавливает пакет в режиме редактирования - изменения в исходном коде применяются без переустановки.

При использовании SSH-ссылок необходимо настроить ключи доступа. Для публичных репозиториев на GitHub можно использовать git+https://github.com/user/repo.git без аутентификации.

Пример 5: pip-sync - точная синхронизация окружения с requirements.txt

Команда pip-sync из набора pip-tools устанавливает именно те версии, которые указаны в файле, удаляя пакеты, отсутствующие в списке.

Пример
$ pip-sync requirements.txt
Uninstalling pandas-2.0.3:
  Successfully uninstalled pandas-2.0.3
Installing numpy-1.25.2:
  Successfully installed numpy-1.25.2
... (синхронизация завершена)

Если нужно оставить пакеты, не указанные в файле, используется флаг --dry-run.

Команда может удалить важные системные пакеты, если они случайно не включены в файл. Рекомендуется предварительно создавать резервную копию окружения или использовать виртуальное окружение.

Пример 6: Генерация requirements.txt из setup.py или pyproject.toml

Если проект распространяется как пакет, зависимости могут быть указаны в setup.py или pyproject.toml. Для извлечения списка можно использовать pip freeze после установки пакета в режиме редактирования.

Пример
# Установка пакета в текущей директории с учётом зависимостей
$ pip install -e .
# Затем создание requirements.txt
$ pip freeze > requirements.txt

Также инструменты типа pip-compile поддерживают прямое чтение из pyproject.toml.

Пример
$ pip-compile pyproject.toml
# Сгенерированный файл requirements.txt
Django==4.2.7
requests==2.31.0
... (все зависимости, включая транзитивные)

При таком подходе могут быть включены не все тестовые зависимости. Для раздельного управления требуется дополнительная конфигурация.

Пример 7: Использование --no-deps для установки только явно указанных пакетов

Опция --no-deps указывает pip не устанавливать зависимости пакетов. Это может быть полезно, когда все зависимости уже есть или управляются отдельно.

Пример
# requirements.txt (только прямые пакеты)
Django
requests

$ pip install --no-deps -r requirements.txt

В результате будут установлены только Django и requests, но не их зависимости (asgiref, certifi и т.д.).

Установка без зависимостей может привести к неработоспособности пакетов, если окружение не содержит нужных библиотек.

Пример 8: Проверка целостности и разрешение конфликтов с помощью pip check

После установки зависимостей полезно выполнить команду pip check, которая проверяет, что все зависимости удовлетворены и нет конфликтов.

Пример
$ pip check
No broken requirements found.
# или
$ pip check
requests 2.31.0 requires urllib3>=1.21.1, but you have urllib3 1.26.15 which is incompatible.

Если pip выявил конфликт, следует обновить или понизить версии пакетов, отредактировав requirements.txt и повторно запустив установку.

Команда проверяет только установленные пакеты, но не проверяет совместимость версий, указанных в файле. Поэтому лучше запускать pip check после каждой установки.

Пример 9: Экспорт зависимостей с указанием source (комментариями) для pip-compile

При использовании pip-compile в результирующем файле автоматически добавляются комментарии о том, откуда взята каждая зависимость. Это облегчает аудит.

Пример
$ pip-compile requirements.in -o requirements.txt
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#    pip-compile requirements.in
#
Django==4.2.7
    # via -r requirements.in
asgiref==3.7.2
    # via django
...
# The following packages are considered to be unsafe in a requirements file:
# setuptools, pip (не устанавливаются, но отмечены)

Такой файл легко проверять при код-ревью.

Ручное редактирование этого файла может нарушить согласованность с requirements.in. Править нужно только исходный файл.

Файл requirements.txt в Python - comments

En
Python файл requirements (python)