Файл зависимостей Python: требования и способы его формирования

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

Основные методы создания requirements.txt

Файл requirements.txt используется для фиксации зависимостей Python-проекта. Его основная цель - обеспечить воспроизводимость окружения при развёртывании или совместной работе. Существует несколько подходов к его формированию, каждый из которых подходит для разных сценариев.

Как создать requirements.txt с помощью pip freeze?

Самый распространённый и быстрый способ - команда pip freeze, которая выводит список всех установленных в текущем окружении пакетов вместе с их версиями. Результат можно перенаправить в файл:

pip freeze > requirements.txt

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

После выполнения в текущей директории появится файл requirements.txt со строками вида:

Django==3.2.16
requests==2.28.1
urllib3==1.26.12

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

Этот способ подходит для небольших проектов, где все зависимости установлены только для этого проекта (желательно в изолированном виртуальном окружении). Версии фиксируются жёстко, что гарантирует идентичность окружения при установке через pip install -r requirements.txt.

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

  • Попадание лишних пакетов. Если в окружении установлены пакеты, не используемые в проекте (например, глобальные или от других экспериментов), они тоже попадут в файл. Решение - всегда активировать чистое виртуальное окружение и устанавливать зависимости только через pip install <пакеты>.
  • Отсутствие виртуального окружения. Без него pip freeze выведет все системные пакеты, что сделает список огромным и неприменимым. Перед генерацией рекомендуется создать и активировать виртуальное окружение: python -m venv venv.
  • Не фиксируются подзависимости с нужными версиями. Если какой-то пакет установлен с нежёсткой версией (например, Django>=3.2), pip freeze всё равно запишет точную версию, что хорошо. Но если в проекте использовались разные окружения для разных веток, версии могут различаться.

Когда и зачем использовать ручное создание requirements.txt?

Ручное написание файла оправдано, когда нужно указать только ключевые пакеты без точных версий (например, Django>=3.2, requests) или когда проект очень маленький. Также это полезно для демонстрации минимальных требований.

# requirements.txt
Django>=3.2,<4
requests>=2.25
numpy
pandas

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

При установке через pip install -r requirements.txt pip сам подберёт подходящие версии. Минусы: возможные конфликты версий при установке и отсутствие воспроизводимости без заморозки.

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

  • Синтаксические ошибки (пропущены имена пакетов, неверные операторы сравнения). Рекомендуется проверять файл командой pip check.
  • Указание версий, которые не существуют или конфликтуют друг с другом. pip выдаст ошибку при установке. Используйте pip install -c constraints.txt для сложных ограничений.

Как создать requirements.txt только из импортов проекта с помощью pipreqs?

Инструмент pipreqs анализирует исходный код проекта (файлы .py) и определяет, какие пакеты реально импортируются, а затем генерирует requirements.txt только для них. Это избавляет от лишних зависимостей, попавших через pip freeze.

pip install pipreqs
pipreqs /путь/к/проекту --force

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

После выполнения будет создан файл requirements.txt только с используемыми пакетами и их текущими версиями (из установленных).

Цель использования: когда нужно получить чистый список зависимостей, не содержащий тестовых или разовых пакетов. Подходит для CI/CD, когда важно минимизировать количество пакетов.

Проблемы:

  • Некоторые пакеты могут импортироваться динамически (например, через __import__ или плагины) и не быть обнаруженными. Придётся добавлять их вручную.
  • Не обрабатываются зависимости, используемые в Jupyter Notebook, скриптах с нестандартными расширениями или встроенными модулями.
  • Возможны ошибки кодировки при сканировании. Используйте флаг --encoding utf-8.

Как управлять зависимостями с помощью pip-tools (requirements.in и pip-compile)?

pip-tools предлагает двухэтапный подход: вы пишете файл requirements.in с основными зависимостями (без версий или с верхними границами), а затем команда pip-compile генерирует из него полный requirements.txt с замкнутыми подзависимостями и точными версиями.

# requirements.in
Django>=3.2,<4
requests

# Команда:
pip-compile requirements.in --output-file requirements.txt

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

# Результат в requirements.txt
#
# This file is autogenerated by pip-compile
# To update, run:
#    pip-compile requirements.in
#
Django==3.2.18
    # via -r requirements.in
asgiref==3.5.2
    # via django
pytz==2022.7
    # via django
requests==2.28.2
    # via -r requirements.in
certifi==2022.12.7
    # via requests
charset-normalizer==2.1.1
    # via requests
idna==3.4
    # via requests
urllib3==1.26.14
    # via requests

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

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

Случаи использования: средние и крупные проекты, где важно контролировать версии каждой подзависимости; ситуации, когда требуется совместимость между разными окружениями (dev/staging/prod).

Частые ошибки:

  • Несовместимость версий, указанных в requirements.in (например, Django<3.2 и requests>=2.30). pip-compile выдаст ошибку о невозможности найти решение.
  • Забыли добавить подзависимости. Это нормально - pip-compile добавляет их автоматически. Не нужно дублировать их в requirements.in.
  • Конфликт с уже установленными версиями. При первом запуске pip-compile может взять версии из текущего окружения. Чтобы пересчитать всё заново, используйте --upgrade.

Как использовать Poetry для формирования requirements.txt?

Poetry - современный менеджер зависимостей, который хранит информацию в pyproject.toml и poetry.lock. Для экспорта в классический requirements.txt существует команда poetry export.

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

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

Эта команда создаёт requirements.txt на основе poetry.lock с точными версиями, пригодными для pip install. Флаг --without-hashes убирает хэши, что упрощает чтение файла.

Цель: если проект уже использует Poetry для управления зависимостями, но требуется совместимость с инструментами, основанными на requirements.txt (например, Docker).

Проблемы:

  • Необходимость предварительно инициализировать проект через poetry init и добавить зависимости через poetry add.
  • Команда экспорта не обновляет poetry.lock автоматически. Перед экспортом следует выполнить poetry lock.
  • При использовании --dev можно включить dev-зависимости: poetry export --dev -f requirements.txt.

Как Pipenv помогает в создании requirements.txt?

Pipenv также автоматизирует управление зависимостями через Pipfile и Pipfile.lock. Для генерации requirements.txt используется команда pipenv lock -r.

pipenv lock -r > requirements.txt

Эта команда извлекает зависимости из Pipfile.lock и выводит их в формате, совместимом с pip install -r. Обычно включаются только production-пакеты; для dev-зависимостей можно использовать --dev.

Случай использования: проекты, где уже используется Pipenv, но требуется передать окружение в среду, поддерживающую только requirements.txt.

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

  • Если Pipfile.lock отсутствует или устарел, команда выдаст ошибку. Нужно сначала выполнить pipenv lock.
  • В выводе могут присутствовать лишние строки (например, пустые). Рекомендуется перенаправлять вывод в файл сразу.
  • Не поддерживает такие функции, как указание хэшей или несколько групп зависимостей (только dev/prod). Для более сложной логики лучше использовать pip-tools.
- Python файл requirements (файл requirements.txt в python)
- как создать requirements txt файл python (создать файл requirements.txt)

Расширенные примеры и команды

В этом разделе приведены детальные примеры с реальным выводом и пояснениями для каждого инструмента.

Пример 1: pip freeze с фильтрацией и виртуальным окружением

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

Пример
python -m venv .venv
# Windows: .venv\Scripts\activate
# Linux/Mac: source .venv/bin/activate
pip install Django requests
pip freeze > requirements.txt
# Содержимое requirements.txt
asgiref==3.5.2
Django==3.2.18
certifi==2022.12.7
charset-normalizer==2.1.1
idna==3.4
pytz==2022.7
requests==2.28.2
urllib3==1.26.14

Обратите внимание: попали все подзависимости. Если нужно исключить какие-то (например, тестовые), можно отфильтровать результат:

Пример
pip freeze | grep -v "^pkg-resources\|^#" > requirements.txt

Пример 2: pipreqs с указанием кодировки и игнорированием тестов

Пример
pip install pipreqs
pipreqs /home/user/myproject --force --encoding utf-8 --ignore tests/

Если в проекте есть динамические импорты, pipreqs может их пропустить. Решение - добавить пакеты вручную после генерации либо использовать --mode gt для более агрессивного поиска.

Пример 3: pip-tools с разделением на production и dev

Создадим два входных файла:

Пример
# requirements/base.in
Django>=3.2
requests

# requirements/dev.in
-c base.in
pytest
black

Команды для компиляции:

Пример
pip-compile requirements/base.in --output-file requirements.txt
pip-compile requirements/dev.in --output-file requirements-dev.txt
# requirements.txt (сокращённо)
Django==3.2.18
    # via -r requirements/base.in
...

# requirements-dev.txt
#
# This file is autogenerated by pip-compile
#    via -c base.in, requirements/dev.in
#
pytest==7.2.1
    # via -r requirements/dev.in
black==22.12.0
    # via -r requirements/dev.in
...
Django==3.2.18
    # via base.in (via -c base.in)

Флаг -c base.in в dev.in указывает, что основные зависимости нужно взять из уже скомпилированного base.in (или requirements.txt). Это гарантирует единую версию Django.

Пример 4: Poetry экспорт с хэшами и dev-зависимостями

Пример
poetry init
poetry add django requests
poetry add --dev pytest
poetry lock
poetry export -f requirements.txt --output requirements.txt --with dev

Флаг --with dev включает dev-зависимости. Если нужно сохранить хэши (для повышения безопасности), опустите --without-hashes:

# requirements.txt (с хэшами)
django==3.2.18 \
    --hash=sha256:d8b0c... \
    --hash=sha256:e8c1a...
requests==2.28.2 \
    --hash=sha256:abc...
...

Такой файл можно использовать только с pip install --require-hashes -r requirements.txt.

Пример 5: Pipenv экспорт с указанием групп

Пример
pipenv install django requests
pipenv install --dev pytest
pipenv lock
pipenv lock -r > requirements.txt
pipenv lock -r --dev >> requirements-dev.txt
# requirements.txt
Django==3.2.18
requests==2.28.2
...

# requirements-dev.txt (содержит и dev, и prod, но обычно лучше разделять)
Django==3.2.18
requests==2.28.2
pytest==7.2.1
...

Для чистого разделения можно использовать только production через pipenv lock -r без флага --dev.

Создание requirements.txt для Python - comments

En
сделать requirements python (python)