requirements.txt это текстовый файл со списком библиотек, без которых проект на Python не запустится. Создают его одной командой pip freeze > requirements.txt, а ставят всё по списку командой pip install -r requirements.txt. Обе команды выполняют внутри виртуального окружения venv, иначе в файл попадёт всё, что когда-либо ставилось в систему.
Ниже разберём, как создать файл, как установить зависимости из requirements.txt на другом компьютере, как записывать версии и что означают типовые ошибки pip. Все команды мы прогнали в Python 3.14 и pip 26.2, вывод в примерах настоящий.
SkillboxПрофессия «Python-разработчик»157 335 ₽10 месяцев
НетологияFullstack-разработчик на Python137 000 ₽21 месяц
GeekBrainsДО Профессия Python-разработчик149 001 ₽10 месяцев
SkillFactoryПрофессия Python-разработчик140 040 ₽10 месяцев
Академия СинергияPython-разработчик + ИИ77 900 ₽6 месяцев
ЭдюсонPython-разработчик89 919 ₽9 месяцев
Как создать requirements.txt через pip freeze

Самый короткий путь подходит для любого проекта, где библиотеки уже установлены и код работает.
- Откройте терминал в папке проекта. Если вы ещё не запускали Python из консоли, начните с инструкции о том, как запустить скрипт Python через командную строку.
- Активируйте окружение:
source .venv/bin/activateна macOS и Linux,.venv\Scripts\activateна Windows. В начале строки появится(.venv). - Поставьте нужные пакеты, если их ещё нет:
pip install requests flask. - Сохраните список:
pip freeze > requirements.txt. На Windows то же самое пишут какpy -m pip freeze > requirements.txt. - Откройте файл и проверьте, что в нём только пакеты проекта.
Мы поставили в пустое окружение две библиотеки, а файл получился из двенадцати строк:
(.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 МБ и привязана к вашей системе.
Формат файла: версии, комментарии и условия

Каждая строка файла это один пакет или одна опция 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 рядом с кодом:
# 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 его не требует. Так один файл версий можно подключить сразу к нескольким проектам.
Как собрать 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.
Где освоить Python системно
requirements.txt нужен в каждом проекте, от учебного приложения на Flask до сервиса, который собирают в exe через PyInstaller. Зависимости, окружения и сборку проекта обычно разбирают в первых модулях курсов по Python, вместе с Git и работой на сервере.
Ниже курсы из каталога курсов Python с ценами и программами:
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 137 000 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 754 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Профессия Python-разработчик Перейти на сайт курса | 140 040 ₽ | 3890 ₽/мес. | 10 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




