как вызывать метод другого класса, объект которого был создан в другом потоке?
Всем здравствуйте) У меня есть класс для моего телеграм бота:
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 шт):
У вас фундаментальная проблема с логикой работы программы.
Вы не можете вызвать send_info пока вам не придет, команда start от пользователя (до этого у бота еще нет сохраненного chat_id), а вы пробуете это делать сразу же после запуска бота. Ясно, что ничего не работает.
То есть чтоб решить проблему нужно ждать пока не присоединится пользователь и только после этого можно делать send_info.
