11 октября 2026 г.
Как создать requirements.txt для Telegram-бота
Бот написан, на компьютере работает, и теперь его нужно запустить на сервере или хостинге. Первое, что там спросят, — requirements.txt: список библиотек, которые нужно установить, чтобы бот запустился. Без него сервер не знает, что ставить. Ниже три способа его сделать и как проверить, что файл правильный.
Что это за файл
Обычный текстовый файл, по одной библиотеке на строку. Сервер выполняет pip install -r requirements.txt и ставит ровно то, что там перечислено. Для типичного бота на aiogram он выглядит так:
aiogram>=3 python-dotenv aiosqlite
Кладётся в корень репозитория, рядом с главным файлом бота (bot.py, main.py). Имя строго requirements.txt, без заглавных букв и без .txt.txt (Windows любит прятать расширение).
Способ 1. Руками — для небольшого бота лучший
- Откройте все
.py-файлы бота и выпишите всё, что стоит послеimportиfrom … import. - Вычеркните стандартную библиотеку Python — она есть всегда:
os,sys,json,asyncio,sqlite3,logging,datetime,random,reи т.п. - Оставшееся запишите в файл — но под именем пакета, а не модуля (таблица ниже).
Имя в import ≠ имя пакета
Главная ловушка. В коде одно имя, а устанавливать нужно другое:
import в коде → строка в requirements.txt telebot → pyTelegramBotAPI telegram → python-telegram-bot dotenv → python-dotenv PIL → Pillow bs4 → beautifulsoup4 yaml → PyYAML
Полная таблица и разбор ошибки, которая получается, если перепутать, — в статье про ModuleNotFoundError: No module named.
Способ 2. pip freeze — только из виртуального окружения
Если вы с самого начала работали в venv, достаточно одной команды:
# активируйте окружение проекта, потом: pip freeze > requirements.txt
Если же пакеты ставились в системный Python, pip freeze выгрузит всё, что когда-либо стояло на компьютере: библиотеки от других проектов, пакеты только под Windows. Часть из них на сервере не соберётся, и бот упадёт ещё на установке. В этом случае лучше способ 1 или 3.
Способ 3. Сгенерировать по импортам
Утилита pipreqs читает импорты в коде и пишет файл сама:
pip install pipreqs pipreqs . --force
Результат стоит проверить глазами: изредка она подставляет не тот пакет или ставит версии точнее, чем нужно. Если не хочется ничего ставить, вставьте код бота в наш бесплатный генератор requirements.txt — он работает прямо в браузере и знает частые пары «импорт → пакет» для ботов.
Версии: когда их фиксировать
Для старта версии можно не указывать: поставится последняя. Но если код написан под конкретную мажорную версию, зафиксируйте её, иначе завтра выйдет новая и всё сломается. Самый частый случай — aiogram:
- код с
executor.start_polling,@dp.message_handler— это aiogram 2, пишитеaiogram==2.25.2. Но он ставится только на Python 3.11 и старше — на 3.12 сборка падает, подробнее в статье про executor; - код с
@dp.message(…)иdp.start_polling(bot)— aiogram 3, пишитеaiogram>=3.
Подробно про разницу — в статье cannot import name 'executor' from 'aiogram.utils'.
Проверьте файл перед деплоем
Создайте чистое окружение и поставьте в него только то, что в файле. Ровно это сделает сервер:
python -m venv /tmp/check source /tmp/check/bin/activate # Windows: \tmp\check\Scripts\activate pip install -r requirements.txt python bot.py
Запустился — значит, на сервере тоже запустится. Упал с ModuleNotFoundError — допишите недостающий пакет и повторите. Не забудьте закоммитить и запушить файл: частая ошибка — создать его локально и не отправить в репозиторий.
Или без всего этого
botdepo при деплое смотрит импорты в вашем коде. Если requirements.txt нет, он покажет готовый список строк, которые нужно в него положить, а если не хватает одной библиотеки — назовёт её прямо в логе. Задеплоить бота.
Частые вопросы
Где должен лежать requirements.txt?
В корне репозитория, рядом с главным файлом бота. Если бот лежит в подпапке, сервер файл не найдёт — перенесите и бота, и файл в корень.
Нужно ли писать sqlite3, asyncio, os?
Нет. Это стандартная библиотека, она уже есть в Python. Если их записать, pip упадёт с «No matching distribution found».
А если бот на Node.js?
Тогда вместо requirements.txt нужен package.json — его создаёт npm init, а библиотеки туда записывает npm install имя.