Управление зависимостями Python с помощью requirements.txt
Основы использования requirements.txt
Файл requirements.txt представляет собой текстовый файл, в котором перечислены пакеты Python и их версии, необходимые для работы приложения. Этот файл позволяет воспроизвести окружение на другой машине, упрощает развертывание и обеспечивает согласованность зависимостей.
Как зафиксировать текущее окружение в requirements.txt?
Основной способ – использование команды pip freeze. Она выводит список всех установленных пакетов с их текущими версиями. Результат можно перенаправить в файл:
pip freeze > requirements.txtRequests python versions (проверка версии библиотеки requests в 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 get requirements (получение списка зависимостей requirements.txt в python)
Как установить все зависимости из файла?
Для установки пакетов, перечисленных в requirements.txt, используется команда:
pip install -r requirements.txt
проверить библиотеки python (проверка установленных библиотек 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.0No matching distribution found for python (решение ошибки «no matching distribution found» при установке пакетов 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.gzPython файл requirements (файл requirements.txt в python)
Ключ -e означает установку в режиме редактирования (для локальной разработки).
Как использовать альтернативный индекс пакетов?
Если требуется установить пакет из частного репозитория, можно указать индекс через параметр -i непосредственно в команде или в самом файле с помощью опции --index-url:
pip install -r requirements.txt --index-url https://private.pypi.org/simple/Installing python modules (установка модулей python)
Также допустимо записать эту опцию в файле:
# requirements.txt
--index-url https://private.pypi.org/simple/
package-name==1.0.0Python requirements (файл requirements.txt в 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 в реальных проектах.