Requirements.txt в Python: как создать файл и установить зависимости из него

requirements.txt хранит список библиотек проекта с версиями. Создать его можно командой pip freeze > requirements.txt, а установить всё по списку командой pip install -r requirements.txt.

Разобрали формат файла, операторы версий, отдельные файлы для разработки, pipreqs и pip-tools, а также ошибки pip с настоящим выводом.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3161 статья автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3815 экспертных мнений Подписаться на Телеграм-канал
Обложка: Requirements.txt в Python: как создать файл и установить зависимости из него

requirements.txt это текстовый файл со списком библиотек, без которых проект на Python не запустится. Создают его одной командой pip freeze > requirements.txt, а ставят всё по списку командой pip install -r requirements.txt. Обе команды выполняют внутри виртуального окружения venv, иначе в файл попадёт всё, что когда-либо ставилось в систему.

Ниже разберём, как создать файл, как установить зависимости из requirements.txt на другом компьютере, как записывать версии и что означают типовые ошибки pip. Все команды мы прогнали в Python 3.14 и pip 26.2, вывод в примерах настоящий.

Как создать requirements.txt через pip freeze

Рой собирает список библиотек проекта в файл requirements.txt

Самый короткий путь подходит для любого проекта, где библиотеки уже установлены и код работает.

  1. Откройте терминал в папке проекта. Если вы ещё не запускали Python из консоли, начните с инструкции о том, как запустить скрипт Python через командную строку.
  2. Активируйте окружение: source .venv/bin/activate на macOS и Linux, .venv\Scripts\activate на Windows. В начале строки появится (.venv).
  3. Поставьте нужные пакеты, если их ещё нет: pip install requests flask.
  4. Сохраните список: pip freeze > requirements.txt. На Windows то же самое пишут как py -m pip freeze > requirements.txt.
  5. Откройте файл и проверьте, что в нём только пакеты проекта.

Мы поставили в пустое окружение две библиотеки, а файл получился из двенадцати строк:

(.venv) $ pip install requests flask
(.venv) $ pip freeze > requirements.txt
(.venv) $ cat requirements.txt
blinker==1.9.0
certifi==2026.10.23
charset-normalizer==3.5.2
click==8.5.0
Flask==3.1.3
idna==3.20
itsdangerous==2.2.0
Jinja2==3.1.6
MarkupSafe==3.0.4
requests==2.34.2
urllib3==2.8.0
Werkzeug==3.1.9

Лишнего тут нет. pip freeze записывает всё дерево зависимостей: requests тянет за собой certifi, idna, urllib3 и charset-normalizer, Flask тянет Werkzeug, Jinja2 и ещё четыре пакета. Каждый стоит с точной версией через ==, поэтому на другой машине соберётся то же самое окружение.

Какие пакеты вы ставили сами, покажет другая команда:

(.venv) $ pip list --not-required
Package  Version
-------- -------
Flask    3.1.3
pip      26.2.1
requests 2.34.2

Сам pip в requirements.txt не попадает. По справке pip, на Python 3.12 и новее freeze пропускает только pip, а на 3.11 и старше ещё setuptools и wheel. Если они нужны в списке, добавьте флаг --all.

Как установить зависимости из requirements.txt

На новом компьютере, на сервере или после удаления старого окружения хватает трёх команд:

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

На Windows вторая строка выглядит как .venv\Scripts\activate. Флаг -r обязателен: он говорит pip, что дальше идёт имя файла со списком.

Мы проверили это на чистом окружении. После установки сравнили новый pip freeze с исходным файлом командой diff, расхождений ноль, все двенадцать пакетов тех же версий. Так же ставят зависимости и на сервер, когда выкладывают проект, например Telegram-бота на aiogram.

Где хранить файл: в корне проекта, рядом с главным скриптом. pip ищет путь относительно папки, в которой открыт терминал. В репозиторий кладут requirements.txt, а папку .venv не кладут: у нас с requests и Flask она заняла 23 МБ и привязана к вашей системе.

Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Формат файла: версии, комментарии и условия

Коробки-пакеты с бирками версий разложены по полкам

Каждая строка файла это один пакет или одна опция pip. Строка с # в начале считается комментарием. Файл можно писать и руками, когда точные версии не нужны:

# Основные зависимости проекта
requests>=2.32,<3       # любая 2.x, начиная с 2.32
flask~=3.1.0            # 3.1.0 и выше, но ниже 3.2
python-dotenv==1.1.1    # точная версия
pandas==2.3.3 ; python_version < "3.11"
pandas==3.0.1 ; python_version >= "3.11"

Операторы версий описаны в стандарте PEP 440. В таблице те, что встречаются чаще всего:

Запись Что поставит pip Когда подходит
requests последнюю версию на момент установки учебный проект, где версия не важна
requests==2.34.2 ровно эту версию рабочий проект, сервер, совместная работа
requests>=2.32,<3 любую от 2.32 до 3.0, не включая её библиотека нужна с определённой функцией, но без мажорного обновления
flask~=3.1.0 3.1.0 и новее в ветке 3.1 хотите исправления ошибок, но не новую минорную версию
numpy!=2.0.0 любую, кроме указанной в одной версии нашли ошибку

Оператор ~= читается неочевидно. В PEP 440 он назван «compatible release»: запись ~= 2.2 равна паре >= 2.2, == 2.*. Значит, ~=3.1.0 не пустит Flask 3.2, а ~=3.1 пустит.

Хвост после точки с запятой называется маркером окружения, синтаксис описан в PEP 508. В примере выше библиотека pandas версии 3.0.1 требует Python 3.11 и новее, так указано на PyPI. На Python 3.14 pip ставит третью ветку, а про вторую сообщает: Ignoring pandas: markers 'python_version < "3.11"' don't match your environment.

Ещё три правила формата из справки pip:

  • комментарий в конце строки отделяют пробелом, иначе pip не распознает #;
  • кодировка файла по умолчанию UTF-8;
  • вместо токенов и паролей можно писать переменные окружения в виде ${API_TOKEN}, pip подставит значение при установке.

Несколько файлов: разработка, продакшн и constraints

Тесты и линтеры на сервере не нужны, поэтому их выносят в отдельный файл. Первой строкой он подключает основной список, а оба файла лежат в репозитории Git рядом с кодом:

CheckroiCheckroiПодборка курсов по Тестам110 курсов • 19 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→
# requirements-dev.txt
-r requirements.txt
pytest>=8

Команда pip install -r requirements-dev.txt поставит и основные пакеты, и pytest. На сервере ставят только requirements.txt.

Есть и третий вид файла, constraints. Он задаёт версии, но сам ничего не устанавливает. В руководстве pip сказано, что такой файл управляет только тем, какая версия пакета будет установлена, а не тем, будет ли он установлен вообще.

# constraints.txt
urllib3==2.5.0
numpy==2.5.4

$ pip install -r requirements.txt -c constraints.txt

Мы проверили на файле, где была одна строка requests. urllib3 встал версии 2.5.0, а не свежей 2.8.0, а NumPy не поставился совсем: requests его не требует. Так один файл версий можно подключить сразу к нескольким проектам.

CheckroiCheckroiПодборка курсов по Python569 курсов • 52 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Как собрать requirements.txt по импортам и закрепить всё дерево

У pip freeze два слабых места. Он записывает всё, что стоит в окружении, даже то, что вы поставили на пробу и забыли. И он не отличает ваши пакеты от их зависимостей. Для этих случаев есть отдельные инструменты.

Инструмент Что делает Команда
pipreqs читает import в коде и пишет список без транзитивных зависимостей pipreqs . --force
pip-tools берёт короткий requirements.in и собирает полный requirements.txt с пометками, кто что тянет pip-compile requirements.in
uv делает то же, что pip-compile; написан на Rust uv pip compile requirements.in -o requirements.txt

pipreqs: список по импортам

Удобен, когда достался чужой код без списка зависимостей, например после форка репозитория на GitHub. Мы дали pipreqs 0.4.13 файл с семью импортами: os, json, requests, cv2, sklearn, dotenv и yaml. Стандартные модули он верно пропустил и сам перевёл имена импортов в имена пакетов: sklearn стал scikit-learn, yaml стал PyYAML.

А cv2 из списка пропал. В консоли осталось предупреждение Package "cv2" does not exist or network problems, и файл без OpenCV записался как ни в чём не бывало. Поэтому список от pipreqs всегда читают глазами, и сама утилита в конце работы просит то же самое. Если файл уже есть, без флага --force pipreqs его не перезапишет.

pip-tools и uv: короткий список на входе, полный на выходе

В requirements.in пишут только то, что проект использует напрямую:

# requirements.in
requests>=2.32
flask~=3.1

После pip-compile requirements.in получается requirements.txt с точными версиями всех двенадцати пакетов, и у каждого видно, откуда он взялся:

markupsafe==3.0.4
    # via
    #   flask
    #   jinja2
    #   werkzeug
requests==2.34.2
    # via -r requirements.in

Обновлять зависимости так проще: правите короткий .in, пересобираете длинный .txt. Команда uv pip compile дала нам тот же набор версий. Разработчики uv пишут, что он в 10–100 раз быстрее pip.

Хеши: защита от подмены пакета

Флаг pip-compile --generate-hashes дописывает к каждому пакету контрольные суммы SHA-256. На наших двенадцати пакетах вышло 343 хеша: у MarkupSafe и charset-normalizer отдельные сборки под каждую систему. По справке pip, режим проверки хешей защищает от подмены пакетов при скачивании и от сетевых сбоев.

Режим включается сам, как только хеш есть хотя бы у одной строки. Тогда хеш нужен всем. Строка pytest==9.2.0 без хеша в таком файле остановит всю установку:

ERROR: Hashes are required in --require-hashes mode, but they are missing
from some requirements.

В pip есть и команда pip lock, которая пишет файл pylock.toml с адресами и хешами всех пакетов. Пока она экспериментальная, pip так и предупреждает при запуске, поэтому основной формат для проектов по-прежнему requirements.txt.

Частые ошибки и что с ними делать

Рой уверенно отмечает пункты чек-листа

Could not open requirements file

ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'

Терминал открыт не в той папке. Перейдите в корень проекта командой cd или укажите путь целиком: pip install -r app/requirements.txt.

No matching distribution found for requirements.txt

ERROR: Could not find a version that satisfies the requirement requirements.txt (from versions: none)
HINT: You are attempting to install a package literally named "requirements.txt" (which cannot exist).

Забыли флаг -r, и pip ищет на PyPI пакет с именем «requirements.txt». Подсказка в выводе говорит то же самое.

Could not find a version that satisfies the requirement

Такой версии пакета нет или она не подходит к вашему Python. На строке requests==9.9.9 pip выводит весь список доступных версий, по нему видно, какую поставить. Если пакета нет в списке совсем, проверьте имя: опечатка вроде reqeusts даёт ту же ошибку с пометкой from versions: none.

Invalid requirement: Expected comma

ERROR: Invalid requirement: 'requests==2.34.2# comment'

Перед # нет пробела, и pip считает комментарий частью номера версии. Решение: requests==2.34.2 # comment.

Старый файл долго ставится или падает на сборке

Версия из файла вышла раньше вашего Python, и готовой сборки под него нет. Мы поставили numpy==1.26.4 на Python 3.14: pip скачал архив исходников на 15,8 МБ и собирал пакет на месте. На Mac с инструментами разработчика сборка прошла, а без компилятора C она не пройдёт.

Решение: поднять версию в файле или создать окружение на том Python, под который файл писали.

Пакет установлен, а import не работает

Зависимости встали в одно окружение, а код запускается из другого. Проверьте, что в терминале активирован .venv и что редактор смотрит на тот же интерпретатор. Как выбрать интерпретатор, мы показывали в статье про настройку VS Code для Python, а разбор ModuleNotFoundError на живом примере есть в инструкции как установить PyGame.

Файл не обновляет пакеты

Команда pip install -U -r requirements.txt при точных версиях через == ничего не обновит: файл прямо запрещает другие версии. Мы проверили на urllib3 2.5.0, он остался на месте. Посмотреть, что устарело, можно через pip list --outdated, затем поставить новые версии и снова сохранить pip freeze > requirements.txt.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 800 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Где освоить Python системно

requirements.txt нужен в каждом проекте, от учебного приложения на Flask до сервиса, который собирают в exe через PyInstaller. Зависимости, окружения и сборку проекта обычно разбирают в первых модулях курсов по Python, вместе с Git и работой на сервере.

CheckroiCheckroiПодборка курсов по Git364 курса • 32 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Ниже курсы из каталога курсов Python с ценами и программами:

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология137 000 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 754 ₽4108 ₽/мес.9 месяцевОбзор курса
Профессия Python-разработчик
Перейти на сайт курса
SkillFactorySkillFactory140 040 ₽3890 ₽/мес.10 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Что такое requirements.txt в Python?

Это текстовый файл со списком библиотек проекта, по одной на строку, обычно с точной версией: requests==2.34.2. По нему pip ставит те же пакеты на другом компьютере или сервере. Подробнее о том, где этот файл живёт, в статье про виртуальное окружение venv.

Как создать файл requirements.txt?

Активируйте виртуальное окружение проекта и выполните pip freeze > requirements.txt. Файл появится в текущей папке со всеми установленными пакетами и их версиями. Если окружения нет, а код есть, список можно собрать по импортам утилитой pipreqs, но его стоит проверить вручную.

Как установить все библиотеки из requirements.txt?

Командой pip install -r requirements.txt из папки, где лежит файл. Без флага -r pip будет искать пакет с именем «requirements.txt» и выдаст ошибку No matching distribution found.

Нужно ли указывать версии в requirements.txt?

Для рабочего проекта да: точная версия через == гарантирует, что у всех соберётся одно и то же. Для учебного скрипта можно писать только имена пакетов, тогда pip поставит свежие версии. Промежуточный вариант: диапазон вроде requests>=2.32,<3.

Как обновить пакеты из requirements.txt?

Посмотрите устаревшие пакеты командой pip list --outdated, обновите нужные через pip install -U имя_пакета и снова сохраните список: pip freeze > requirements.txt. Команда pip install -U -r requirements.txt при точных версиях ничего не обновит.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!