Управление зависимостями Python с помощью requirements.txt
Основы использования requirements.txt
Файл requirements.txt представляет собой текстовый файл, в котором перечислены пакеты Python и их версии, необходимые для работы приложения. Этот файл позволяет воспроизвести окружение на другой машине, упрощает развертывание и обеспечивает согласованность зависимостей.
Как зафиксировать текущее окружение в requirements.txt?
Основной способ – использование команды pip freeze. Она выводит список всех установленных пакетов с их текущими версиями. Результат можно перенаправить в файл:
pip freeze > requirements.txtInstalling python modules (установка модулей python)
Пояснение: команда запускается в активированном виртуальном окружении. После выполнения в текущей директории появится файл requirements.txt со строками вида package==version.
$ pip freeze > requirements.txt $ cat requirements.txt numpy==1.24.3 pandas==2.0.3 requests==2.31.0
Python requirements (файл requirements.txt в python)
Как установить все зависимости из файла?
Для установки пакетов, перечисленных в requirements.txt, используется команда:
pip install -r requirements.txt
Python requirements file (файл requirements.txt в python)
Параметр -r указывает pip читать список пакетов из файла. Установка происходит автоматически с учетом версий.
Типичная ошибка: если файл содержит конфликтующие версии (например, numpy==1.24.3 и другой пакет требует numpy>=1.25), установка прервется с сообщением о несоответствии. Решение: отредактировать файл, выбрав совместимые версии, или использовать pip install -r requirements.txt --upgrade для обновления.
Как создать requirements.txt вручную?
Иногда требуется указать не все пакеты окружения, а только необходимые для проекта. В таком случае файл создается вручную. Каждая строка – это имя пакета, optionally с указанием версии:
# requirements.txt (ручное заполнение)
flask==2.3.3
gunicorn
# это комментарий
pandas>=1.5.0, <2.0.0Python get requirements (получение списка зависимостей requirements.txt в python)
Примечание: комментарии начинаются с #. Можно задавать диапазоны версий, минимальные версии и исключения.
Как разделить зависимости для разработки и продакшена?
Часто требуются разные наборы пакетов для разных сред. Самый простой способ – создать несколько файлов: requirements-base.txt, requirements-dev.txt и т.д. Затем в основном файле можно ссылаться на другие файлы через -r:
# requirements.txt (основной)
-r requirements-base.txt
-r requirements-dev.txtсделать requirements python (создание requirements.txt для python)
Или использовать отдельные команды для установки:
pip install -r requirements-base.txt
pip install -r requirements-dev.txtPython uv install (установка пакетов с помощью uv в python)
Популярная альтернатива – разделение на секции с помощью файла environment.yml (для conda) или использование групп зависимостей в Pipfile (Pipenv).
Проблема дублирования: если оба файла содержат один и тот же пакет с разными версиями, pip может выбрать непредсказуемую версию. Рекомендуется вынести общие зависимости в отдельный файл, который включается всеми остальными.
Как указать зависимости из репозитория или локального пути?
В requirements.txt можно ссылаться не только на PyPI, но и на Git-репозитории, архивы или локальные папки:
# ссылка на ветку git
-e git+https://github.com/user/package.git@branch#egg=package-name
# локальный wheels
./dist/mypackage-1.0.0-py3-none-any.whl
# URL архива
https://example.com/packages/mypackage.tar.gzRequests python versions (проверка версии библиотеки requests в python)
Ключ -e означает установку в режиме редактирования (для локальной разработки).
Как использовать альтернативный индекс пакетов?
Если требуется установить пакет из частного репозитория, можно указать индекс через параметр -i непосредственно в команде или в самом файле с помощью опции --index-url:
pip install -r requirements.txt --index-url https://private.pypi.org/simple/проверить библиотеки python (проверка установленных библиотек python)
Также допустимо записать эту опцию в файле:
# requirements.txt
--index-url https://private.pypi.org/simple/
package-name==1.0.0No matching distribution found for python (решение ошибки «no matching distribution found» при установке пакетов python)
Как игнорировать некоторые пакеты при установке?
Если нужно пропустить часть зависимостей (например, пакеты для тестирования), можно использовать флаг --no-deps, но это не избирательно. Лучше создать отдельный файл для продакшена без dev-зависимостей, как описано выше.
Распространенная проблема: платформозависимые пакеты (например, pywin32) могут быть указаны в requirements.txt и вызвать ошибку на Linux. Решение: использовать маркеры окружения, поддерживаемые pip (начиная с pip 6.0):
pywin32; sys_platform == "win32"
pyobjc; sys_platform == "darwin"
Эти условия проверяются при установке, и пакет устанавливается только на соответствующей платформе.
На этом базовая работа с requirements.txt заканчивается. Для более сложных проектов рекомендуется рассмотреть специализированные инструменты: Poetry, Pipenv или Conda, которые автоматически управляют файлами зависимостей и разрешают конфликты.
Расширенные примеры работы с requirements.txt
Как экспортировать только прямые зависимости?
Команда pip freeze выводит все установленные пакеты, включая транзитивные. Для получения только тех пакетов, которые явно добавлены в проект, можно использовать pip list --format=freeze | grep -v "-" (на Linux) или более надежный метод – установить pip-tools:
pip install pip-tools
# создаём requirements.in с прямыми зависимостями
# компилируем в requirements.txt
pip-compile requirements.in
$ cat requirements.in flask numpy $ pip-compile requirements.in # файл requirements.txt будет сгенерирован со всеми зависимостями и подверсиями
Как обновить все зависимости до последних версий, сохраняя ограничения?
Для обновления пакетов в requirements.txt до последних совместимых версий (с учетом заданных диапазонов) используется pip install --upgrade -r requirements.txt. Но эта команда обновит только те пакеты, версия которых явно не зафиксирована. Если нужно обновить всё, следует сначала снять фиксацию (package>=x вместо package==x), выполнить обновление и затем снова зафиксировать.
# исходный файл с фиксацией
numpy==1.24.3
pandas==2.0.3
# замена на >=
pip install --upgrade -r requirements.txt # обновит до последней версии
pip freeze > requirements.txt # обновлённый финал
Как проверить наличие конфликтов до установки?
Инструмент pip check проверяет, все ли зависимости удовлетворены. Если есть конфликт, он сообщит о несовместимых версиях.
pip check
$ pip check No broken requirements found.
Для более глубокого анализа можно использовать pipdeptree:
pip install pipdeptree
pipdeptree
pipdeptree
numpy==1.24.3
pandas==2.0.3
- numpy [required: >=1.20.3, installed: 1.24.3]
- python-dateutil [required: >=2.8.1, installed: 2.8.2]
- six [required: >=1.5, installed: 1.16.0]
requests==2.31.0
...
Как интегрировать requirements.txt с Docker?
В Dockerfile часто копируют 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"]
Преимущество: при изменении кода приложения, но не зависимостей, слой с установкой кешируется, что ускоряет сборку.
Как использовать requirements.txt с проектами на базе setuptools?
Файл requirements.txt не является частью стандартной упаковки Python, но его можно указать в setup.py или setup.cfg. Однако удобнее использовать install_requires в setup.py для долгосрочных проектов, а requirements.txt – для временного воспроизведения окружения. Например:
# setup.py
from setuptools import setup
setup(
name="mypackage",
install_requires=[
"numpy>=1.20",
"pandas",
],
extras_require={
"dev": ["pytest", "sphinx"]
},
)
Для установки с dev-зависимостями: pip install -e .[dev]
Как зашифровать пароль для частного репозитория в requirements.txt?
Не рекомендуется хранить пароли в файле. Вместо этого используется --extra-index-url с переменными окружения или конфигурация pip в pip.conf/~/.netrc.
# .netrc
machine private.pypi.org login user password secret
# затем в requirements.txt:
--extra-index-url https://private.pypi.org/simple/
my-private-package==1.0
Эти примеры покрывают большинство сценариев повседневного использования requirements.txt в реальных проектах.