как вызывать метод другого класса, объект которого был создан в другом потоке?

Всем здравствуйте) У меня есть класс для моего телеграм бота:

class TelegramBot:

    __token = 'my token'

    def __init__(self):
        self.__bot = telebot.TeleBot(token=TelegramBot.__token)
        self.__chat_id = 0
        self.send_greeting = self.__bot.message_handler(commands=['start'])(self.send_greeting)
        self.__bot.polling(none_stop=True)

    def send_greeting(self, message):
        self.__chat_id = message.chat.id
        greeting = f"Hello, {message.from_user.full_name}!"
        self.__bot.send_message(chat_id=self.__chat_id, text=greeting)

    def send_info(self, some_info='info'):
        self.__bot.send_message(chat_id=self.__chat_id, text=some_info)

В другом классе (находящемся в другом файле) я создаю объект класса TelegramBot в другом потоке:

def __bot_launch(self):
        self.my_bot = telegram_bot.TelegramBot
        Thread(target=self.my_bot, daemon=True).start()       
        print('bot launched!')

Мне нужно вызывать метод send_info() из этого класса. Я пробовал:

1. В классе TelegramBot из конструктора удалить self.__bot.polling(none_stop=True) и создать новый метод:

def __init__(self):
        self.__bot = telebot.TeleBot(token=TelegramBot.__token)
        self.__chat_id = 0
        self.send_greeting = self.__bot.message_handler(commands=['start'])(self.send_greeting)

def initialize():
    __bot.polling(none_stop=True)

И в другом классе я сделал это:

 def __bot_launch(self):
        self.my_bot = telegram_bot.TelegramBot()
        Thread(target=self.my_bot.initialize, daemon=True).start()
        print('bot launched!')
        self.my_bot.send_info()

Но в этом случае я получил ошибку:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "C:\python\lib\threading.py", line 973, in _bootstrap_inner
    self.run()
  File "C:\python\lib\threading.py", line 910, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\USER\Desktop\simple_parser_v2.0\telegram_bot.py", line 25, in send_info
    self.__bot.send_message(chat_id=self.__chat_id, text=message)
  File "C:\python\lib\site-packages\telebot\__init__.py", line 1005, in send_message
    apihelper.send_message(
  File "C:\python\lib\site-packages\telebot\apihelper.py", line 267, in send_message
    return _make_request(token, method_url, params=payload, method='post')
  File "C:\python\lib\site-packages\telebot\apihelper.py", line 152, in _make_request
    json_result = _check_result(method_name, result)
  File "C:\python\lib\site-packages\telebot\apihelper.py", line 179, in _check_result
    raise ApiTelegramException(method_name, result, result_json)
telebot.apihelper.ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: chat not found

Та же ситуация, если я пытаюсь вызвать send_info() следующим образом:

Thread(target=self.my_bot.send_info, daemon=True).start()

2. Я попытался убрать класс TelegramBot:

__token = 'my token'

__bot = telebot.TeleBot(token=__token)
__chat_id = 0


def initialize():
    __bot.polling(none_stop=True)


@__bot.message_handler(commands=['start'])
def send_greeting(message):
    __chat_id = message.chat.id
    greeting = f"Hello, {message.from_user.full_name}!"
    __bot.send_message(chat_id=__chat_id, text=greeting)


def send_info(some_info=' '):
    __bot.send_message(chat_id=__chat_id, text=some_info)

И в другом классе я сделал это:

 def __bot_launch(self):
        Thread(target=telegram_bot.initialize, daemon=True).start()
        print('bot launched!')
        Thread(target=telegram_bot.send_info, daemon=True).start()

Еще вот так пытался:

def __bot_launch(self):
        Thread(target=telegram_bot.initialize, daemon=True).start()
        print('bot launched!')
        telegram_bot.send_info()

Но была такая же ошибка...

3. Еще пробовал унаследовать класс TelegramBot от Thread, и в другом классе сделать так:

    def __bot_launch(self):
        my_thread = telegram_bot.TelegramBot()
        my_thread.start()
        my_thread.send_info()
        print('bot launched!')

Но надпись bot launched не выводится, а значит бот работает в основном потоке...

Если можете, помогите пожалуйста

введите сюда описание изображения


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

Автор решения: Roman-Stop RU aggression in UA

У вас фундаментальная проблема с логикой работы программы.

Вы не можете вызвать send_info пока вам не придет, команда start от пользователя (до этого у бота еще нет сохраненного chat_id), а вы пробуете это делать сразу же после запуска бота. Ясно, что ничего не работает.

То есть чтоб решить проблему нужно ждать пока не присоединится пользователь и только после этого можно делать send_info.

→ Ссылка