Python requirements.txt: создание и применение
Основы работы с requirements.txt
Как наиболее эффективно зафиксировать и восстановить окружение Python?
Для быстрой фиксации всех установленных пакетов с точными версиями используется команда pip freeze > requirements.txt. Этот файл содержит одну строку на пакет в формате пакет==версия. Пример:
$ pip freeze > requirements.txtInstalling 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.3Python 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.txtPython 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.txtPython 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.txtNo 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.txtContents 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.txtPip будет учитывать ограничения при выборе версий всех зависимых пакетов.
Если ограничения противоречат друг другу, 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.txtUninstalling 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. Править нужно только исходный файл.