Почему у модуля telebot нету класса types?
Что в такой ситуации делать? устанавливал даже pytelegrambotapi, но оно не помогает.
- Вопрос задан более двух лет назад
- 4207 просмотров
Комментировать
Решения вопроса 1
pip uninstall telebot pip uninstall PyTelegramBotAPI pip install PyTelegramBotAPI
и библиотеку telebot не надо больше пытаться ставить, правильная PyTelegramBotAPI
Ответ написан более двух лет назад
Комментировать
Нравится 3 Комментировать
Ответы на вопрос 0
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- Python
Как сгенерировать случайное имя файла?
- 1 подписчик
- 2 часа назад
- 45 просмотров

- Python
Когда запускаю клиента вылетает из всех устройств?
- 1 подписчик
- 6 часов назад
- 44 просмотра
Как ипортировать функции из файлов?

Ещё один товарищ не учил Питон, но рвётся написать божественного бота.
Когда ты импортируешь файл (модуль), этот модуль выполняется — практически так же, как если бы ты его запустил непосредственно. Различие есть, но небольшое. Теперь посмотрим на твои файлы.
В первом файле ты объявляешь переменную bot. Она существует в пространстве имён первого файла (модуля).
Если ты в нём делаешь import second_file , в нём тоже присутствует создание переменной bot — в локальном пространстве имён этого модуля. Это две разные переменные, и два разных экземпляра класса Telebot.
Поэтому когда ты выполняешь в одном файле bot.run() (ну или как там бот запускается), ты запускаешь только один экземпляр. Второй остаётся неактивированным, и всё, что к нему привязано, не работает.
Тебе надо как-то передать переменную bot во-второй файл, не нарвавшись при этом на циклический импорт (чтобы не было «первый импортирует второй, а второй — первый»).
Тут поможет ещё один простой факт: в питоне всё — операторы. Т.е. объявление функции — это оператор. Его можно помещать куда угодно, внутрь любого блока программы: внутрь if, внутрь цикла, внутрь другой функции. Он выполнится при выполнении соответствующего блока.
Так что ты можешь завернуть свои обработчики из второго файла в функцию, принимающую ссылку на bot. А потом импортировать эту внешнюю функцию в первый файл и там её вызвать.
#второй файл, second_file.py import telebot from telebot import types # эта функция создаст все обработчики и зарегистрирует их в предоставленном боте # вызывай её строго один раз за скрипт def register_handlers(bot): # а тут уже пошли обработчики @bot.message_handler(commands=['start']) def start(message): markup = types.ReplyKeyboardMarkup(resize_keyboard=True) btn0 = types.KeyboardButton(' Каталог фильмов') btn1 = types.KeyboardButton(" Каталог фильмов") btn2 = types.KeyboardButton(' Случайный фильм') btn3 = types.KeyboardButton(' Предложить фильм') markup.add(btn0, btn1, btn2, btn3) bot.send_message(message.from_user.id, ' Привет, . Я Kinomorph - бот, с которым ты можешь найти интересный фильм для просмотра вечером\n \n Если у тебя есть номер или название фильма, ввести его можно прямо сейчас'.format(message.from_user), reply_markup=markup) # любой код, который не должен исполняться при импорте, оформляй так: if __name__ == '__main__': # переменная __name__ содержит имя, под которым импортируется модуль print('Этот код выполнится ТОЛЬКО если файл запущен напрямую.') print('Он не выполнится при импорте файла.')
# первый файл, main.py import telebot import config import second_file # модуль импортируется - в нём __name__ будет равно "second_file", а не "__main__" # инициализация bot = telebot.TeleBot(config.Token) second_file.register_handlers(bot) # тут вызывается импортированная функция
