"RuntimeWarning: coroutine 'main' was never awaited" Телеграм бот на пайтон

Я попытался запустить бота, но получил сообщение:
«RuntimeWarning: coroutine „main“ was never awaited»:

Вот файл .py:

import asyncio # модуль asyncio используется для асинхронного программирования
import logging # модуль дляя логирования
import telegram
from dotenv import load_dotenv
import os
from telegram import Update
from telegram import Chat
from telegram import Message
from telegram import User
from telegram.ext import (
    Application,
    ApplicationBuilder,
    ContextTypes,
    CommandHandler,
    ContextTypes,
    ConversationHandler,
    MessageHandler,
    filters,
)


# Настройка логирования
logging.basicConfig(level=logging.INFO, filename="py_log.log", filemode="w")

# Загрузка переменных окружения из .env файла
load_dotenv()

# Получение токена бота из переменных окружения
BOT_TOKEN = os.getenv("BOT_TOKEN")
if not BOT_TOKEN:
    raise ValueError("Токен бота не найден!")

# Логируем успешную загрузку
print(f"Bot token: {BOT_TOKEN}")

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.message.from_user
    print(f"Пользователь {user.first_name} начал использовать бота")

    await update.message.reply(f"Я твой бот для заметок")

    context.user_data['user_name'] = user.first_name

async def show_name(update: Update, context: ContextTypes.DEFAULT_TYPE):
    name = context.user_data.get('user_name', 'Неизвестный пользователь')
    await update.message.reply(f"Ваше имя {name}.")

async def main():
    application = Application.builder().token(BOT_TOKEN).build()
    # Логируем запуск бота
    print("Запускаю бота...")

    # Обработчики команд
    application.add_handler(CommandHandler("start", start))
    application.add_handler(CommandHandler("show_name", show_name))

    # Запуск бота в режиме polling
    print("Бот запущен. Ожидаю команды...")
    await application.run_polling(drop_pending_updates=True)

if __name__ == '__main__':
    import asyncio
    asyncio.create_task(main())
    asyncio.get_event_loop().run_forever()

Я пытался удалять и добавлять, что выделено //
if name == 'main':
//import asyncio //asyncio.run(main())

Но ничего не помогло


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Упростим пример:

import asyncio


async def main():
    print('Hi!')


asyncio.create_task(main())
asyncio.get_event_loop().run_forever()

Запустим, чтобы проверить что ошибка на месте:

$ py temp.py
Traceback (most recent call last):
  File "/home/sv/desk/stackoverflow/temp.py", line 8, in <module>
    asyncio.create_task(main())
  File "/usr/lib/python3.11/asyncio/tasks.py", line 371, in create_task
    loop = events.get_running_loop()
           ^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: no running event loop
sys:1: RuntimeWarning: coroutine 'main' was never awaited

Предположу, что вы привели в вопросе не все ошибки и предупреждения. У меня ошибка возникает раньше, при вызове asyncio.create_task(main()).

Документация по asyncio утверждает что стартовать надо по другому: asyncio.run(main()). Пробуем.

import asyncio


async def main():
    print('Hi!')


asyncio.run(main())

Работает:

$ py temp.py
Hi!
→ Ссылка