Файл requirements.txt в Python: от простого списка до профессионального управления
Основные подходы к управлению зависимостями с requirements.txt
Файл requirements.txt является стандартным способом фиксации зависимостей проекта на Python. Он содержит список пакетов с версиями, необходимых для работы приложения. Ниже рассмотрены различные способы его создания и использования.
Как зафиксировать все установленные пакеты для воспроизведения окружения?
Наиболее распространенный метод - команда pip freeze. Она выводит список всех пакетов, установленных в текущем виртуальном окружении, вместе с их версиями. Перенаправление вывода в файл позволяет получить requirements.txt.
pip freeze > requirements.txtInstalling python modules (установка модулей python)
(содержимое файла, например) requests==2.31.0 numpy==1.24.3 flask==2.3.2 ...
Python requirements (файл requirements.txt в python)
Для установки зависимостей из такого файла используется:
pip install -r requirements.txt
Python requirements file (файл requirements.txt в python)
Цель: быстрое копирование точного состояния окружения для развертывания или совместной работы.
Случаи использования: небольшие проекты, прототипы, когда важно точное соответствие версий.
Типичные проблемы и ошибки:
- Команда
pip freezeзахватывает все пакеты, включая те, что не используются напрямую (например, зависимости зависимостей). Это может привести к раздуванию файла. - Если в окружении установлены пакеты, не относящиеся к проекту (например, глобальные), они тоже попадают в список.
- При развертывании на другой платформе могут возникнуть конфликты из-за разных версий системных пакетов (wheel, setuptools).
- Решение: перед выполнением
pip freezeрекомендуется использовать виртуальное окружение (venv) и выполнять команду только в нем. Также можно отфильтровать системные пакеты:
pip freeze | grep -v 'pip|wheel|setuptools' > requirements.txtPython get requirements (получение списка зависимостей requirements.txt в python)
Как вручную указать только необходимые зависимости с версиями и опциями?
Вместо автоматической генерации можно создать requirements.txt вручную, указав только те пакеты, которые импортируются в коде. Это дает полный контроль над зависимостями.
# requirements.txt (ручное создание)
requests>=2.20.0
flask~=2.3.0
numpy<=1.26.0,>=1.19.0
# комментарии поддерживаются
-e git+https://github.com/psf/requests.git@v2.31.0#egg=requestsсделать requirements python (создание requirements.txt для python)
Поддерживаются версионные спецификаторы (>=, <=, ~=, ==, !=), а также ссылки на репозитории.
Проблемы: ручной список может устареть, легко пропустить какую-либо зависимость, особенно если проект использует неявные импорты. Нет автоматического обновления версий.
Как автоматически определить используемые в проекте пакеты и создать requirements.txt?
Инструмент pipreqs сканирует исходный код проекта и формирует список только тех пакетов, которые действительно импортируются. Это решает проблему лишних зависимостей.
pip install pipreqs
pipreqs /path/to/project --ignore venv --savepath requirements.txtPython uv install (установка пакетов с помощью uv в python)
(создается файл только с библиотеками, используемыми в коде)
Requests python versions (проверка версии библиотеки requests в python)
Цель: получение минимального набора зависимостей, упрощение воспроизведения окружения.
Типичные ошибки: pipreqs может не распознать динамические импорты или библиотеки, которые не импортируются напрямую, но являются зависимостями других библиотек. Также может включать пакеты, используемые только в тестах. Рекомендуется проверять результат вручную.
Как управлять зависимостями через Pipenv с автоматической изоляцией?
Pipenv создает виртуальные окружения автоматически и использует файлы Pipfile и Pipfile.lock. Из них можно экспортировать классический requirements.txt.
pip install pipenv
cd /myproject
pipenv install requests flask
pipenv lock -r > requirements.txtпроверить библиотеки python (проверка установленных библиотек python)
(создает requirements.txt с точными версиями из lock-файла)
No matching distribution found for python (решение ошибки «no matching distribution found» при установке пакетов python)
Цель: упрощение управления виртуальными окружениями и зависимостями, автоматический lock-файл для детерминизма.
Проблемы: Pipenv может быть медленным, не всегда корректно обрабатывает конфликты разрешений версий. В больших проектах сложнее отлаживать зависимости.
Как использовать Poetry для управления зависимостями в pyproject.toml?
Poetry - современный инструмент, который использует стандарт pyproject.toml и предоставляет команды для экспорта в requirements.txt.
pip install poetry
cd /myproject
poetry init
poetry add requests
poetry export -f requirements.txt --output requirements.txtPython файл requirements (файл requirements.txt в python)
(создает requirements.txt с зависимостями и подзависимостями)
как создать requirements txt файл python (создать файл requirements.txt)
Цель: единый формат для метаданных и зависимостей, поддержка сборки пакетов, автоматические обновления.
Ошибки: может возникнуть несовместимость с более старыми версиями pip, если экспортированный файл содержит нестандартные URI. Также требуется установка самого Poetry на всех машинах разработки.
Как управлять зависимостями через Conda с файлом environment.yml?
Conda - менеджер пакетов и окружений, популярный в научном сообществе. Экспорт окружения в YAML-формат, который можно конвертировать в requirements.txt.
conda env export --from-history > environment.yml
Для конвертации в requirements.txt можно использовать conda list --export:
conda list --export > requirements.txt
(получается список в формате, похожем на pip)
Цель: использование в проектах с не-Python зависимостями или при необходимости специфических бинарных библиотек.
Проблемы: файл requirements.txt из Conda может содержать пакеты, которых нет в PyPI. Также Conda создает изолированное окружение, но его размер может быть большим.
Как использовать pip-tools для создания чистого requirements.txt из файла с верхнеуровневыми зависимостями?
pip-tools предоставляет утилиты pip-compile и pip-sync. Пользователь описывает только прямые зависимости в файле requirements.in, а затем генерируется полный lock-файл requirements.txt.
# requirements.in
requests
flask
pip-compile requirements.in
(создается requirements.txt со всеми разрешенными версиями)
Цель: разделение прямых и косвенных зависимостей, получение детерминированных сборок.
Ошибки: pip-compile может быть медленным при большом количестве зависимостей. Необходимость запуска процесса компиляции при каждом изменении.
Расширенные примеры использования requirements.txt
Ниже приведены дополнительные примеры, которые помогут более гибко управлять зависимостями.
Пример 1: Использование опции --hash для верификации пакетов
pip freeze --hash > requirements.txt
В результате файл содержит хеши каждого пакета, что повышает безопасность, но делает его менее читаемым. Установка с проверкой хеша возможна только при указании --require-hashes.
Пример 2: Фильтрация системных пакетов с помощью grep (Windows)
pip freeze | findstr /V 'pip wheel setuptools' > requirements.txt
На Windows аналог grep - findstr. Удаляет строки, содержащие указанные пакеты.
Пример 3: Извлечение зависимостей из Pipenv с разделением на dev и prod
pipenv lock -r --dev > dev-requirements.txt
pipenv lock -r > requirements.txt
Флаг --dev включает dev-зависимости. Таким образом можно разделить окружение для разработки и продакшена.
Пример 4: Poetry - экспорт только определенных групп зависимостей
poetry export -f requirements.txt --dev --without-hashes --output dev-reqs.txt
Экспорт с dev-зависимостями, без хешей, в отдельный файл.
Пример 5: Использование pip-tools с указанием совместимых версий
# requirements.in
numpy>=1.20
scipy~=1.7
pip-compile --upgrade-package numpy --output-file new-requirements.txt requirements.in
Команда обновляет только указанный пакет и пересчитывает зависимости.
Пример 6: Создание requirements.txt из Conda окружения с сохранением каналов
conda list --explicit > requirements.txt
Этот формат включает точные URL пакетов, что подходит для точного воспроизведения, но не совместим с pip.
Пример 7: Интеграция requirements.txt в Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD python app.py
Такой подход минимизирует количество слоев и ускоряет сборку.
Пример 8: Использование pip freeze с виртуальным окружением, созданным в Python 3.12
python -m venv .venv
source .venv/bin/activate # Linux/Mac
pip install -r requirements.txt
pip freeze > requirements.lock.txt
Создание lock-файла после установки - двойная фиксация зависимостей.
Пример 9: Автоматическое создание requirements.txt из pyproject.toml без сторонних инструментов
С помощью pip install . и последующего pip freeze можно получить список, но это не рекомендуется.
pip install -e .
pip freeze > requirements.txt
Проблема: захватываются все пакеты окружения.