5 проверенных способов автоматизировать создание requirements.txt
Для кого эта статья:
- Python-разработчики на разных уровнях опыта
- Специалисты по DevOps и CI/CD
Студенты и обучающиеся в области программирования и разработки веб-приложений
Ручное составление списка зависимостей — один из тех скучных процессов, который каждый Python-разработчик стремится автоматизировать. Пропустив всего одну библиотеку в requirements.txt, вы рискуете потратить часы на отладку проекта, который "у вас работал, но не запускается у коллег". К счастью, существуют надёжные инструменты, способные автоматически сформировать корректный список зависимостей, избавив вас от головной боли и потери продуктивности. Рассмотрим пять проверенных методов, которые позволят вам больше никогда не составлять requirements.txt вручную. 🚀
Если вы хотите глубже погрузиться в мир управления зависимостями и освоить профессиональные практики Python-разработки, обратите внимание на Обучение Python-разработке от Skypro. На курсе вы не только изучите автоматизацию управления пакетами, но и научитесь создавать масштабируемые веб-приложения, используя Django и Flask, а также внедрять CI/CD для бесперебойной интеграции вашего кода. Наши выпускники экономят до 30% времени на рутинных задачах!
Что такое requirements.txt и зачем его автоматизировать
Файл requirements.txt — это стандартный способ документирования зависимостей Python-проекта. По сути, это обычный текстовый файл, содержащий список пакетов с их версиями, необходимыми для корректной работы вашего приложения. Каждая строка такого файла представляет собой одну зависимость в формате package==version.
Почему так важно автоматизировать создание этого файла? 🤔
- Устранение человеческого фактора — ручное составление списка зависимостей чревато ошибками и пропусками
- Экономия времени — в проектах с десятками зависимостей автоматизация экономит часы работы
- Воспроизводимость окружения — точное указание версий гарантирует идентичность среды разработки и продакшена
- Управление транзитивными зависимостями — многие библиотеки сами имеют зависимости, отслеживать которые вручную практически невозможно
- Обновление проекта — при добавлении новых функций и библиотек автоматическая генерация избавляет от необходимости вспоминать, что было добавлено
Интересный факт: согласно опросу Python Developers Survey 2022, более 70% разработчиков регулярно используют автоматические инструменты для управления зависимостями вместо ручного редактирования requirements.txt.
| Проблема ручного создания | Последствия | Решение через автоматизацию |
|---|---|---|
| Забытые зависимости | Неработоспособность проекта на других машинах | Полный автоматический анализ всех импортов |
| Неточные версии пакетов | Конфликты зависимостей, непредсказуемое поведение | Точная фиксация версий используемых библиотек |
| Устаревшие зависимости | Уязвимости безопасности, отсутствие новых функций | Регулярное автоматическое обновление списка |
| Избыточные пакеты | Раздутый размер проекта, долгая установка | Умный анализ реально используемых библиотек |
Алексей Петров, Senior Python Developer Когда-то я потерял целый день, пытаясь понять, почему наш микросервис работал на моей машине, но отказывался запускаться на сервере. Оказалось, я забыл добавить в requirements.txt библиотеку, которую установил локально месяц назад. С тех пор у нас железное правило: никаких ручных правок в файле зависимостей. Мы настроили хук pre-commit, который автоматически обновляет requirements.txt при каждом коммите, если в проекте появились новые импорты. Количество проблем с развертыванием сократилось на 90%, а я больше не получаю паническим сообщений от DevOps посреди ночи.

Стандартный метод: pip freeze для создания requirements.txt
Самый простой и распространенный способ автоматического создания файла requirements.txt — использование встроенной команды pip freeze. Это базовый метод, который знаком практически каждому Python-разработчику, но его применение требует понимания нюансов.
Принцип работы pip freeze прост: команда формирует список всех установленных в текущем Python-окружении пакетов вместе с их версиями. Для сохранения этого списка в файл используется перенаправление вывода:
pip freeze > requirements.txt
Однако у этого метода есть существенный недостаток — pip freeze выводит абсолютно все пакеты из вашего окружения, включая те, которые не используются непосредственно в вашем проекте. Это может привести к "загрязнению" списка зависимостей. 😕
Для решения этой проблемы рекомендуется использовать виртуальные окружения для каждого проекта:
- Создайте виртуальное окружение:
python -m venv env - Активируйте его:
source env/bin/activate(Linux/Mac) илиenv\Scripts\activate(Windows) - Установите только необходимые для проекта пакеты
- Запустите
pip freeze > requirements.txt
Для более продвинутого использования можно применять фильтрацию результатов pip freeze. Например, если вы хотите исключить определенные пакеты:
pip freeze | grep -v "package-to-exclude" > requirements.txt
Или автоматизировать процесс через скрипт Python:
import subprocess
import sys
def generate_requirements():
# Получаем список всех пакетов
result = subprocess.run([sys.executable, '-m', 'pip', 'freeze'],
capture_output=True, text=True)
packages = result.stdout.strip().split('\n')
# Фильтруем нежелательные пакеты
excluded = {'pkg-to-exclude1', 'pkg-to-exclude2'}
filtered = [pkg for pkg in packages if not any(
pkg.startswith(ex) for ex in excluded)]
# Записываем в файл
with open('requirements.txt', 'w') as f:
f.write('\n'.join(filtered))
if __name__ == "__main__":
generate_requirements()
Преимущества и недостатки метода pip freeze:
| Преимущества | Недостатки |
|---|---|
| Встроен в pip, не требует дополнительных инструментов | Включает все установленные пакеты, даже неиспользуемые |
| Гарантирует точные версии пакетов | Не учитывает только импортируемые библиотеки |
| Работает в любом окружении с Python | Требует правильно настроенного виртуального окружения |
| Простота использования | Не разделяет основные и dev-зависимости |
| Высокая скорость работы | Может включать платформо-зависимые пакеты |
Умное управление зависимостями с pipreqs и pip-tools
Хотя pip freeze прост в использовании, его недостаточная "интеллектуальность" побудила сообщество создать более продвинутые решения. Два наиболее популярных из них — это pipreqs и pip-tools, которые подходят к проблеме управления зависимостями с разных сторон. 🧩
Pipreqs: генерация на основе импортов
Pipreqs анализирует импорты в вашем коде и на их основе создает файл requirements.txt, включая только те пакеты, которые действительно используются в проекте. Это решает главную проблему pip freeze — избыточные зависимости.
Установка и использование pipreqs:
- Установите пакет:
pip install pipreqs - Запустите для вашего проекта:
pipreqs /path/to/project
Дополнительные опции pipreqs:
--force: перезаписать существующий файл requirements.txt--diff: вывести различия между существующим и новым файлом--ignore: игнорировать указанные директории (например,--ignore=venv,tests)--encoding: указать кодировку для чтения файлов (по умолчанию utf-8)
Однако pipreqs не всегда может корректно определить все зависимости, особенно если используются динамические импорты или импорты внутри функций.
Pip-tools: точный контроль зависимостей
Pip-tools предлагает двухэтапный подход к управлению зависимостями:
- Вы создаете файл
requirements.inс основными зависимостями проекта - Утилита
pip-compileанализирует этот файл и создает полныйrequirements.txtсо всеми транзитивными зависимостями и точными версиями
Установка и базовое использование pip-tools:
- Установите пакет:
pip install pip-tools - Создайте файл
requirements.inс основными зависимостями, например:
flask
sqlalchemy>=1.4
requests
- Скомпилируйте его:
pip-compile requirements.in - Для установки зависимостей:
pip-sync requirements.txt
Преимущество pip-tools в том, что pip-sync не только устанавливает недостающие пакеты, но и удаляет лишние, точно синхронизируя окружение с requirements.txt.
Марина Соколова, DevOps-инженер В нашем проекте мы столкнулись с проблемой "раздувания" Docker-образов из-за излишних зависимостей. При использовании стандартного pip freeze размер образа достигал 1.2 ГБ, что значительно увеличивало время развертывания и потребление ресурсов. После перехода на pipreqs мы смогли сократить список пакетов почти вдвое, а размер контейнера уменьшился до 700 МБ. Более того, мы интегрировали генерацию requirements.txt в CI-пайплайн, который автоматически обновляет зависимости при изменении кода и выдает предупреждение, если обнаруживаются потенциально конфликтующие версии. Время развертывания сократилось на 40%, а количество проблем с зависимостями в тестовой среде — практически до нуля.
Сравнение pipreqs и pip-tools:
- Pipreqs идеален для быстрого получения списка зависимостей на основе анализа кода
- Pip-tools лучше подходит для долгосрочного управления проектом с четким контролем над всеми зависимостями, включая транзитивные
Можно даже комбинировать эти инструменты: использовать pipreqs для первоначального создания requirements.in, а затем уточнять его и компилировать с помощью pip-tools. 🔄
Автоматизация через Poetry и Pipenv для современных проектов
Современная Python-разработка всё больше отходит от простых файлов requirements.txt в сторону комплексных инструментов управления зависимостями. Poetry и Pipenv представляют собой следующее поколение систем, объединяющих функции виртуальных окружений и управления пакетами. 🔄
Poetry: полный контроль над проектом
Poetry — это мощный инструмент для управления зависимостями Python, который заменяет стандартную комбинацию setup.py, requirements.txt и virtualenv. Его основное преимущество — декларативный подход к описанию проекта в файле pyproject.toml.
Установка и настройка Poetry:
- Установите Poetry:
curl -sSL https://install.python-poetry.org | python3 - - Создайте новый проект:
poetry new project-nameили инициализируйте в существующем:poetry init - Добавьте зависимости:
poetry add package-name
Для генерации requirements.txt на основе Poetry используется команда:
poetry export -f requirements.txt --output requirements.txt
Дополнительные опции экспорта:
--without-hashes— исключить хеш-суммы пакетов--dev— включить dev-зависимости--without-dev— исключить dev-зависимости
Poetry автоматически разрешает конфликты зависимостей и создает lock-файл, гарантирующий воспроизводимость среды разработки.
Pipenv: объединение pip и virtualenv
Pipenv — это инструмент, созданный Кеннетом Рейтцем (автором библиотеки Requests), который объединяет pip и virtualenv. Он упрощает управление зависимостями, автоматически создавая и управляя виртуальным окружением.
Использование Pipenv:
- Установите Pipenv:
pip install pipenv - Добавьте зависимости:
pipenv install package-name - Для dev-зависимостей:
pipenv install package-name --dev
Для экспорта в requirements.txt используйте:
pipenv lock -r > requirements.txt
А для dev-зависимостей:
pipenv lock -r --dev > dev-requirements.txt
Сравнение Poetry и Pipenv для автоматического создания requirements.txt:
| Характеристика | Poetry | Pipenv |
|---|---|---|
| Формат конфигурации | pyproject.toml (PEP 517/518) | Pipfile и Pipfile.lock |
| Скорость работы | Быстрее, особенно при разрешении зависимостей | Может работать медленнее на крупных проектах |
| Разделение dev-зависимостей | Встроенная поддержка | Встроенная поддержка |
| Управление сборкой пакетов | Полноценная поддержка | Ограниченная поддержка |
| Команда экспорта | poetry export -f requirements.txt | pipenv lock -r |
| Интеграция с IDE | Хорошая поддержка в PyCharm, VS Code | Стандартная поддержка в большинстве IDE |
Выбор между Poetry и Pipenv часто сводится к предпочтениям команды и требованиям проекта. Poetry лучше подходит для библиотек и пакетов, которые планируется распространять, в то время как Pipenv может быть проще для небольших проектов и начинающих разработчиков.
Автоматизация процесса обновления requirements.txt может быть реализована через хуки системы контроля версий или скрипты. Например, для Poetry можно добавить pre-commit хук:
#!/bin/sh
# Сохраняем в .git/hooks/pre-commit
poetry export -f requirements.txt --output requirements.txt
git add requirements.txt
Интеграция с CI/CD: автоматическая генерация requirements.txt
Автоматизация создания и обновления файла requirements.txt достигает максимальной эффективности при интеграции с системами непрерывной интеграции и доставки (CI/CD). Такой подход избавляет от необходимости вручную запускать команды и гарантирует актуальность списка зависимостей. 🚀
Рассмотрим основные стратегии интеграции с популярными CI/CD платформами.
GitHub Actions
GitHub Actions позволяет легко автоматизировать обновление requirements.txt при каждом пуше или по расписанию.
Пример workflow-файла (.github/workflows/update-requirements.yml):
name: Update Requirements
on:
push:
paths:
- '**.py' # Срабатывает при изменении Python-файлов
schedule:
- cron: '0 0 * * 0' # Еженедельное обновление
jobs:
update-requirements:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pipreqs
- name: Generate requirements.txt
run: |
pipreqs . --force
- name: Commit changes
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add requirements.txt
git diff --quiet && git diff --staged --quiet || git commit -m "Update requirements.txt"
git push
GitLab CI/CD
Аналогичный подход можно применить в GitLab CI/CD, используя файл .gitlab-ci.yml:
stages:
- update
update_requirements:
stage: update
image: python:3.10
script:
- pip install pipreqs
- pipreqs . --force
- git config --global user.email "gitlab-ci@example.com"
- git config --global user.name "GitLab CI"
- git add requirements.txt
- git diff --quiet && git diff --staged --quiet || (git commit -m "Update requirements.txt" && git push https://${CI_USERNAME}:${CI_TOKEN}@gitlab.com/${CI_PROJECT_PATH}.git HEAD:${CI_COMMIT_REF_NAME})
only:
changes:
- "**.py"
schedules:
- cron: "0 0 * * 0"
Jenkins
Для Jenkins можно создать Pipeline-скрипт, который будет обновлять requirements.txt:
pipeline {
agent {
docker {
image 'python:3.10'
}
}
triggers {
cron('0 0 * * 0') // Еженедельное обновление
}
stages {
stage('Update Requirements') {
steps {
sh 'pip install pipreqs'
sh 'pipreqs . --force'
withCredentials([usernamePassword(credentialsId: 'git-creds', passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
sh '''
git config user.email "jenkins@example.com"
git config user.name "Jenkins"
git add requirements.txt
git diff --quiet && git diff --staged --quiet || (git commit -m "Update requirements.txt" && git push)
'''
}
}
}
}
}
Продвинутые стратегии автоматизации
Помимо базовой генерации requirements.txt, в CI/CD пайплайн можно добавить дополнительные шаги:
- Проверка безопасности зависимостей — интеграция с инструментами вроде Safety или Snyk
- Автоматическое обновление устаревших пакетов — с помощью pip-upgrade или аналогичных инструментов
- Валидация совместимости — тестирование проекта с новыми зависимостями перед коммитом изменений
- Уведомления команды — отправка сообщений об обновлении зависимостей в Slack или другие системы
Пример расширенного workflow для GitHub Actions с проверкой безопасности:
- name: Check dependencies for security vulnerabilities
run: |
pip install safety
safety check -r requirements.txt
Использование CI/CD для автоматической генерации requirements.txt имеет ряд преимуществ:
- Устранение человеческого фактора из процесса
- Гарантия актуальности зависимостей
- Автоматическое обнаружение проблем с совместимостью
- Документированная история изменений зависимостей
- Возможность автоматического создания отдельных требований для разных сред (production/staging/development)
Для небольших проектов можно использовать более простой подход с pre-commit хуками:
#!/bin/bash
# Сохраните как .git/hooks/pre-commit и сделайте исполняемым (chmod +x)
pip-compile requirements.in
git add requirements.txt
Инструменты автоматического создания файла requirements.txt в Python значительно упрощают одну из самых рутинных задач в разработке. От базового pip freeze до сложных систем управления зависимостями как Poetry или интеграции с CI/CD — выбор метода должен зависеть от масштаба вашего проекта и процессов в команде. Помните, что цель автоматизации не просто в экономии времени, а в создании надежной и воспроизводимой среды разработки. Выберите подходящий инструмент, настройте процесс однажды, и вы больше никогда не столкнетесь с проблемой "но у меня это работает!" 💻