Управление проектом Python: как правильно составить файл requirements.txt
Основные способы создания requirements.txt
Наиболее эффективное решение - использование команды pip freeze внутри активного виртуального окружения. Этот метод гарантирует, что в файл попадут только те пакеты, которые реально установлены в текущем окружении, и их точные версии.
Как создать requirements.txt со всеми зависимостями текущего окружения?
pip freeze > requirements.txtInstalling python modules (установка модулей python)
Команда выводит список всех установленных пакетов в формате package==version и перенаправляет вывод в текстовый файл. Если файл уже существует, он будет перезаписан. Чтобы добавить новые зависимости без удаления старых, используют оператор >>:
pip freeze >> requirements.txtPython requirements (файл requirements.txt в python)
После генерации файла открыть его и проверить, что отсутствуют лишние записи (например, pip, setuptools, wheel). Обычно их удаляют вручную, так как они не являются прямыми зависимостями проекта.
Типичная ошибка: выполнение команды вне виртуального окружения. В этом случае pip freeze покажет все глобально установленные пакеты, что приведёт к избыточному и невоспроизводимому списку. Решение: всегда активировать виртуальное окружение (venv или virtualenv) перед запуском команды.
Как создать requirements.txt вручную для небольшого проекта?
Для проектов с двумя-тремя зависимостями проще написать файл самому в текстовом редакторе. Формат: одно имя пакета (или с версией) на строку:
requests
flask==2.3.0
numpy>=1.21
Python requirements file (файл requirements.txt в python)
Цель использования: быстрое прототипирование, когда не нужно отслеживать точные версии или зависимости известны заранее.
Ошибка: указание несовместимых версий. Решение: перед фиксацией проверить совместимость командой pip install -r requirements.txt в чистом окружении.
Как автоматически создать requirements.txt на основе импортов в проекте (без лишних зависимостей)?
Инструмент pipreqs сканирует исходный код и выделяет только те пакеты, которые напрямую импортируются. Установка и использование:
pip install pipreqs
pipreqs /путь/к/проекту --forcePython get requirements (получение списка зависимостей requirements.txt в python)
Флаг --force перезаписывает существующий файл. Если проект содержит много подпапок, рекурсивный поиск выполняется автоматически.
Случай использования: когда нужно избежать включения транзитивных зависимостей и создать минимальный список.
Проблема: pipreqs может пропустить пакеты, которые импортируются динамически (например, в условных импортах). Решение: дополнить файл вручную после проверки.
Ещё одна трудность - неоднозначность имён (например, PIL импортируется как from PIL import Image, а пакет называется Pillow). pipreqs обычно корректно сопоставляет такие псевдонимы, но в сложных случаях требуется ручная корректировка.
Как создать requirements.txt из Pipfile (при использовании Pipenv)?
Pipenv по умолчанию использует Pipfile и Pipfile.lock. Для экспорта в классический requirements.txt применяется команда:
pipenv lock -r > requirements.txtсделать requirements python (создание requirements.txt для python)
Если нужны только зависимости для разработки (dev-packages), добавляют флаг --dev:
pipenv lock -r --dev > requirements-dev.txtPython uv install (установка пакетов с помощью uv в python)
Цель: преобразование формата Pipenv в общепринятый для совместимости с CI/CD или другими разработчиками, не использующими Pipenv.
Ошибка: если Pipfile.lock отсутствует или устарел, команда выдаст предупреждение. Решение: сначала выполнить pipenv lock для обновления lock-файла.
Как сгенерировать requirements.txt из зависимостей Poetry?
В Poetry есть встроенная команда экспорта:
poetry export -f requirements.txt --output requirements.txtRequests python versions (проверка версии библиотеки requests в python)
Чтобы включить dev-зависимости, добавляют флаг --dev:
poetry export --dev -f requirements.txt -o requirements-dev.txtпроверить библиотеки python (проверка установленных библиотек python)
При необходимости можно указать хэши (ключ --with-hashes) для проверки целостности.
Применение: интеграция проектов на Poetry в экосистемы, где требуется только requirements.txt.
Проблема: если в pyproject.toml используются зависимости из частных индексов (--extra-index-url), экспорт может не включить их корректно. Решение: вручную добавить блок --extra-index-url в начало requirements.txt.
Как создать requirements.txt с помощью conda для смешанных проектов (Python + не-Python пакеты)?
Команда conda list --export выводит список из conda-каналов, включая пакеты, установленные не через pip. Однако такой файл не полностью совместим с pip. Лучше использовать раздельное управление или экспорт только pip-части:
conda list | grep -E '^pip|^python' | awk '{print $1"=="$2}' > requirements_conda.txtNo matching distribution found for python (решение ошибки «no matching distribution found» при установке пакетов python)
Или же, если нужно получить список, понятный pip, следует сначала извлечь только pip-пакеты:
conda list --export | grep -E 'pypi' | sed 's/.*=//' > requirements.txtPython файл requirements (файл requirements.txt в python)
Цель: работа в сложных окружениях, где используются не только pip-пакеты, но и conda-каналы (например, бинарные библиотеки).
Типичная ошибка: смешение форматов conda и pip в одном файле, из-за чего pip install -r requirements.txt падает с ошибками. Решение: создавать два отдельных файла: один для conda (environment.yml), второй для pip отсюда.
Как управлять версиями зависимостей через pip-tools (pip-compile)?
Подход «requirements.in / requirements.txt» даёт контроль над прямыми зависимостями, а транзитивные фиксируются автоматически. Сначала создаётся файл requirements.in с перечнем нужных пакетов (можно без версий):
Flask
requests>=2.25
как создать requirements txt файл python (создать файл requirements.txt)
Затем запускается pip-compile для генерации requirements.txt с полными версиями:
pip-compile requirements.inФлаг --upgrade обновляет все пакеты до последних совместимых версий, флаг --output-file позволяет указать имя выходного файла.
Когда используется: в серьёзных проектах, где нужна воспроизводимость сборок и прозрачное обновление зависимостей.
Проблема: pip-compile может не учесть зависимости, указанные с помощью опции --hash или --trusted-host. Решение: эти параметры добавляют вручную в сгенерированный файл.
Расширенные примеры и нестандартные сценарии
Пример 1: requirements.txt с диапазонами версий и ограничениями
Файл может содержать не только точные версии, но и диапазоны, а также комментарии:
# Основные зависимости
Django>=3.2,<4.0
celery>=5.0,!=5.0.1
pandas~=1.3.0 # эквивалентно >=1.3.0,==1.3.*
--extra-index-url https://private-pypi.example.com/simple
private-package==1.0
Комментарии начинаются с #. Опция --extra-index-url позволяет указать дополнительный индекс пакетов (полезно для частных репозиториев). Результат установки: все перечисленные пакеты будут установлены с учётом ограничений.
Пример 2: Использование pip freeze с фильтрацией под Windows и Linux
Чтобы исключить системные пакеты из вывода, применяют grep (Linux) или findstr (Windows).
Linux (bash):
pip freeze | grep -v -E '^(pip|setuptools|wheel|distribute)@' | grep -v '^#' > requirements.txtWindows (PowerShell):
pip freeze | Select-String -NotMatch '^(pip|setuptools|wheel|distribute)@' | Set-Content requirements.txtЭти команды удалят строки, начинающиеся с указанных имён. Результат: чистый файл без встроенных системных пакетов.
Пример 3: Создание requirements.txt из Pipenv с группировкой по категориям
Pipenv позволяет экспортировать обычные и dev-зависимости в разные файлы, а также добавить каналы:
cd /путь/к/проекту
pipenv lock -r --dev > requirements-dev.txt
pipenv lock -r > requirements.txtЕсли проект использует несколько Python-версий, можно указать конкретную версию через переменную среды:
PYTHON=python3.9 pipenv lock -r > requirements-py39.txtРезультат: два отдельных файла, один для продакшна, другой для разработки.
Пример 4: poetry export для проекта с git-зависимостями
В pyproject.toml могут быть зависимости, указанные как git-репозитории:
[tool.poetry.dependencies]
my-lib = {git = "https://github.com/user/my-lib.git", branch = "main"}
При экспорте через poetry export такие зависимости преобразуются в формат:
git+https://github.com/user/my-lib.git@<commit-hash>Пример команды:
poetry export -f requirements.txt --without-hashes -o requirements.txtВывод (пример):
certifi==2023.11.17 git+https://github.com/user/my-lib.git@a1b2c3d4e5f6 requests==2.31.0
Флаг --without-hashes убирает хэши, если они не нужны.
Пример 5: Генерация requirements.txt с помощью pipreqs для проекта с несколькими модулями
Предположим, структура проекта:
my_project/
main.py
utils/
__init__.py
helpers.py
Запуск pipreqs из корня (с флагом --scan-notebooks для Jupyter-ноутбуков):
pipreqs . --force --scan-notebooksЕсли проект использует специфичные импорты, например from cryptography.fernet import Fernet, pipreqs правильно определит пакет cryptography и запишет его в файл. Возможный результат:
cryptography==41.0.7 requests==2.31.0
При этом os, sys и другие встроенные модули не попадут в список.
Пример 6: Использование pip-compile для создания файла с хэшами и проверкой целостности
Команда с опцией --generate-hashes добавляет SHA-256 хэши для каждой зависимости:
pip-compile --generate-hashes --output-file=requirements-hashed.txt requirements.inСодержимое requirements-hashed.txt будет включать строки вида:
flask==2.3.3 \
--hash=sha256:... \
--hash=sha256:...
requests==2.31.0 \
--hash=sha256:...
Такие файлы обеспечивают повторяемость установки, так как пип проверяет хэши скачанных пакетов.
Пример 7: Объединение нескольких requirements-файлов
Часто требуется сборка итогового файла из нескольких источников. Например, есть requirements-base.txt (общие зависимости) и requirements-dev.txt (для разработки). Их можно объединить, удаляя дубликаты:
cat requirements-base.txt requirements-dev.txt | sort | uniq > requirements-all.txtПод Linux. На Windows (PowerShell):
Get-Content requirements-base.txt, requirements-dev.txt | Sort-Object | Get-Unique | Set-Content requirements-all.txtРезультат: единый файл, содержащий все пакеты без повторений.
Пример 8: Автоматическое обновление requirements.txt при помощи pre-commit хука
В репозиторий можно добавить файл .pre-commit-config.yaml:
repos:
- repo: https://github.com/pypa/pip-audit
rev: v2.6.1
hooks:
- id: pip-audit
args: ["-r", "requirements.txt"]
Такой хук при каждом коммите проверяет уязвимости в зависимостях. Аналогично можно автоматически запускать pip-compile при изменении requirements.in.