Формирование списка модулей для Python: лучшие практики
Основные методы генерации requirements.txt
При разработке на Python возникает необходимость зафиксировать используемые библиотеки для воспроизводимого окружения. Файл requirements.txt может быть создан разными способами, каждый из которых подходит для конкретной ситуации. Ниже рассмотрены наиболее распространённые подходы, начиная с универсального решения.
Как получить полный список всех установленных пакетов с указанием версий?
pip freeze - стандартная команда, выводящая все установленные пакеты и их версии в формате, пригодном для файла requirements.txt. Решение подходит для виртуального окружения, где установлены только необходимые зависимости.
pip freeze > requirements.txtInstalling python modules (установка модулей python)
После выполнения в текущей папке появится файл requirements.txt со строками вида flask==2.3.2. Команда не требует дополнительных инструментов и работает в любой среде, где присутствует pip.
Возможная проблема: если в окружении есть лишние пакеты (например, установленные для других проектов), они тоже попадут в файл. Рекомендуется предварительно создавать изолированное виртуальное окружение. Типичная ошибка - отсутствие активации окружения, что приводит к выводу глобально установленных пакетов. Решение: всегда использовать python -m venv venv и активировать окружение перед запуском pip freeze.
Как получить список пакетов без версий, только названия?
Команда pip list --format=freeze выводит тот же результат, что и pip freeze, но с возможностью фильтрации. Чтобы убрать версии, можно передать параметр --format=columns и обработать вывод текстовыми утилитами. Однако проще использовать прямую команду:
pip freeze | cut -d '=' -f1 > requirements_names.txtPython requirements (файл requirements.txt в python)
На системах Windows потребуется другой подход:
powershell -Command "pip freeze | ForEach-Object { $_ -split '=' | Select-Object -First 1 }" > requirements_names.txt
Python requirements file (файл requirements.txt в python)
Проблема: отсутствие версий может привести к несовместимости при развёртывании. Используется только в проектах, где версии не критичны (например, всегда последняя стабильная).
Как сгенерировать requirements.txt только для пакетов, непосредственно используемых в коде?
Инструмент pipreqs анализирует импорты в проекте и формирует файл с минимальным набором зависимостей. Это полезно, когда в окружении много служебных пакетов (например, для тестирования), которые не должны попадать в конечный список.
pip install pipreqs
pipreqs /путь/к/проекту --forcePython get requirements (получение списка зависимостей requirements.txt в python)
Параметр --force перезаписывает существующий requirements.txt. Если указать --mode=gt, будут включены версии с символом >= (минимальные).
Возможные проблемы: pipreqs не всегда корректно обрабатывает динамические импорты или пакеты, устанавливаемые не через pip (например, системные библиотеки). Результат стоит проверять вручную. Ошибка: ModuleNotFoundError при запуске - необходимо убедиться, что сам pipreqs установлен в активированном окружении.
Как автоматически обновлять requirements.txt при добавлении новых зависимостей?
Пакет pip-tools предоставляет команды pip-compile и pip-sync. Для работы понадобится файл requirements.in с верхнеуровневыми зависимостями (без версий), из которого генерируется полный requirements.txt с временными привязками.
# pip install pip-tools
# Файл requirements.in:
flask
requests
# Генерация:
pip-compile requirements.inсделать requirements python (создание requirements.txt для python)
После выполнения появится requirements.txt со всеми транзитивными зависимостями. Если в проекте используется setup.py, можно указать --pip-compile setup.py для анализа зависимостей из него.
Сложность: требуется поддерживать отдельный файл requirements.in. При частом добавлении библиотек процесс может замедлиться. Также возможны конфликты версий, которые pip-compile не всегда разрешает оптимально - следует вручную проверять вывод.
Как получить список зависимостей для проектов с Poetry или Pipenv?
Если проект использует Poetry, файл зависимостей экспортируется командой:
poetry export -f requirements.txt --output requirements.txtPython uv install (установка пакетов с помощью uv в python)
А для Pipenv:
pipenv lock -r > requirements.txtRequests python versions (проверка версии библиотеки requests в python)
Оба подхода учитывают только те зависимости, которые указаны в конфигурационных файлах проекта (pyproject.toml или Pipfile). Это предотвращает включение случайно установленных пакетов.
Проблема: если мигрировать с одного менеджера на другой, формат requirements.txt может отличаться (например, Poetry добавляет хэши). Требуется проверка совместимости. Ошибка: команда poetry export требует установленного плагина poetry-plugin-export (версии Poetry >= 1.2).
Как получить древовидную структуру зависимостей для анализа?
Утилита pipdeptree отображает иерархию установленных пакетов. Её вывод можно преобразовать в формат requirements.txt с помощью флага --freeze:
pip install pipdeptree
pipdeptree --freeze > requirements.txt
Результат содержит только пакеты без дубликатов, в отличие от pip freeze. Полезно для контроля версий транзитивных зависимостей.
Возможная проблема: если пакет имеет конфликтующие версии, pipdeptree может не отобразить все варианты. Рекомендуется использовать вместе с pip check для выявления несовместимостей.
Расширенные примеры с пошаговыми пояснениями
Пример 1. Использование pip freeze с игнорированием отдельных пакетов. Иногда нужно исключить из файла некоторые системные или тестовые пакеты. Для этого можно передать список исключений через grep.
pip freeze | grep -v -E "^(pip|setuptools|wheel|pkg-resources)" > requirements.txt
Результат (файл requirements.txt):
certifi==2023.11.17 charset-normalizer==3.3.2 idna==3.6 requests==2.31.0 urllib3==2.2.0
Пример 2. Генерация requirements.txt с помощью pipreqs для вложенного пакета. Допустим, проект лежит в папке /home/user/myproject, но в нём есть подпапка src с основным кодом. Укажем путь к исходникам:
pipreqs /home/user/myproject/src --savepath /home/user/myproject/requirements.txt
Результат - файл, в котором перечислены только те библиотеки, которые реально импортируются в файлах *.py из папки src:
flask==2.3.2 requests==2.31.0 sqlalchemy==2.0.25
Пример 3. Компиляция зависимостей через pip-tools с указанием версий в формате ~=. Создадим файл requirements.in с содержимым:
# requirements.in
flask~=2.3
requests~=2.31
Запустим команду:
pip-compile requirements.in --output-file requirements.txt
Сгенерированный requirements.txt будет содержать не только указанные пакеты, но и все их зависимости с точными версиями:
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
# pip-compile requirements.in
#
click==8.1.7
# via flask
flask==2.3.2
# via -r requirements.in
itsdangerous==2.1.2
# via flask
jinja2==3.1.2
# via flask
markupsafe==2.1.3
# via jinja2
requests==2.31.0
# via -r requirements.in
Пример 4. Экспорт из Poetry в requirements.txt с группировкой по группам. Если в pyproject.toml определены группы dev и main, можно экспортировать только production зависимости:
poetry export --without-hashes --without dev --format requirements.txt --output requirements_prod.txt
Содержимое requirements_prod.txt:
flask==2.3.2 ; python_version >= "3.8" requests==2.31.0 ; python_version >= "3.8"
Пример 5. Извлечение зависимостей из requirements.txt, созданного pip freeze, и группировка по категориям. Можно написать небольшой скрипт на Python, который читает файл и разделяет зависимости на прямые (известные) и транзитивные.
import subprocess, sys
result = subprocess.run([sys.executable, '-m', 'pip', 'list', '--format=freeze', '--not-required'], capture_output=True, text=True)
non_required = result.stdout.strip().split('\n')
with open('requirements_direct.txt', 'w') as f:
f.write('\n'.join(non_required))
Результат - файл с прямыми зависимостями (те, которые не требуются другими пакетами):
flask==2.3.2 requests==2.31.0