Ответы пользователя по тегу Python
  • Как исправить проблему при выгрузке телеграмм бота на pyTelegramBotAPI на сервера?

    @codingoleg
    Вам же ошибка явно указала, что
    make sure that only one bot instance is running
    Бот с таким токеном уже запущен, поэтому второй не запустится. Остановите работающего бота или создайте новый токен и запустите ваш код с ним.
    Ответ написан
    Комментировать
  • Как вызвать функцию, чтобы код (бот) продолжал работу?

    @codingoleg
    Пример работы на aiogram 2.25. После нажатия /long_task можно нажимать как /start, так и /long_task (запустится еще одна корутина). Также в параметрах executor.start_polling() есть loop, куда можно добавить задачи по крайней мере при старте бота, например, планировщик.
    import asyncio
    import os
    from aiogram import Bot, Dispatcher
    from aiogram.types import Message
    from aiogram.utils import executor
    
    bot = Bot(token=os.environ['token'])
    dp = Dispatcher(bot)
    
    async def long_task():
        for i in range(10):
            print(i)
            await asyncio.sleep(1)
    
    @dp.message_handler(commands=['start'])
    async def dp_start(message: Message):
        await message.answer('Test')
    
    @dp.message_handler(commands=['long_task'])
    async def run_long_task(message: Message):
        print('Старт')
        await long_task()  # Функция, которая долго исполняется
        print('Финиш')
    
    if __name__ == '__main__':
        executor.start_polling(dp, skip_updates=True)
    Ответ написан
  • Как сделать асинхронность в процессах?

    @codingoleg
    Нужны асихронные библиотеки aiogram / pyrogram + schedule / APScheduler. Вот пример на aiogram 2.25 + schedule . Возможно, слегка костыль, но работает. Между выводом 'Старт' и 'Финиш' бот продолжает отзываться на команду /start.
    import asyncio
    import os
    import schedule
    from aiogram import Bot, Dispatcher
    from aiogram.types import Message
    from aiogram.utils import executor
    
    bot = Bot(token=os.environ['token'])
    dp = Dispatcher(bot)
    
    @dp.message_handler(commands=['start'])
    async def dp_start(message: Message):
        await message.answer('Test')
    
    async def run_schedule():
        while True:
            schedule.run_pending()
            await asyncio.sleep(1)  # Раз в секунду проверяем, не настал ли момент выполнять задание
    
    async def long_task():
        print('Старт')
        await asyncio.sleep(10)  # Функция, которая долго исполняется
        print('Финиш')
    
    def do_task():
        asyncio.ensure_future(long_task())
    
    if __name__ == '__main__':
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        loop.create_task(run_schedule())  # Добавляем планировщик в петлю
        # schedule.every(15).seconds.do(do_task)  # Тестовый вариант каждые 15 секунд
        schedule.every(5).minutes.do(do_task)
        executor.start_polling(dp, loop=loop, skip_updates=True)  # Добавляем петлю к боту и запускаем его
    Ответ написан
    Комментировать
  • Почему переменной select_folder не присваивается значение?

    @codingoleg
    Вы не указали код, где создаете экземпляр класса MainWindow и вызываете метод create_button или что там у вас происходит, поэтому ответить невозможно.
    Ответ написан
    Комментировать
  • Как сделать правильный порядок отображения?

    @codingoleg
    from collections import Counter
    
    user = ['one', 'one', 'one', 'four']
    glob = [('two',), ('two',), ('three',)]
    
    def combine(user, glob):
        suggestions_user = [item[0] for item in Counter(user).most_common()]
        suggestions_global = [item[0] for item in Counter(i[0] for i in glob).most_common()]
    
        return {
            'suggestions_user': suggestions_user,
            'suggestions_global': suggestions_global,
            'combined_suggestions': suggestions_user + suggestions_global
        }
    Ответ написан
    Комментировать
  • Почему не проходит код для решения задачи на leetcode?

    @codingoleg
    Потому что 'list' object has no attribute 'split'. Рекомендую ознакомиться с типами данных и их методами. Выход из функции с любым количеством циклов осуществляется через return.
    Ответ написан
  • Как Python и Selenium заставить найти текст?

    @codingoleg
    Попробуй искать по xpath, а не по ID. Тогда точно найдешь.
    Ответ написан
    Комментировать
  • Не правильная проверка ячейки таблицы через цикл, почему не записывается переменная?

    @codingoleg
    fetchall и fetchone возвращают список кортежей. Поэтому el[3] - это тоже tuple, а не int. Нужное значение внутри должно быть, например, el[3][0].
    Ответ написан
    Комментировать
  • Почему callback_query_handler не видит call.data?

    @codingoleg
    Не понятно, на какой библиотеке вы это делаете. Вот вам пример на aiogram 2.25. Думаю, в остальных будет примерно так же, кроме добавленных слов async/await. Сделал по вашему шаблону, но лучше хэндлер с callback разделить на несколько, если их планируется много. Рекомендую ознакомиться, чем отличается types.Message от types.CallbackQuery, а также message_handler от callback_query_handler, чтобы в будущем не было проблем.
    from aiogram import Bot, Dispatcher, executor, types
    
    bot = Bot('token')
    dp = Dispatcher(bot)
    
    @dp.message_handler(commands=['start'])
    async def get_phone(message: types.Message):
        keyboard = types.InlineKeyboardMarkup()
        key_1 = types.InlineKeyboardButton(text='button 1', callback_data='b1')
        keyboard.add(key_1)
        key_2 = types.InlineKeyboardButton(text='button 2', callback_data='b2')
        keyboard.add(key_2)
        await bot.send_message(message.from_user.id, text='Выберите, нажав одну из кнопок:', reply_markup=keyboard)
    
    @dp.callback_query_handler(lambda call: True)
    async def get_storage(callback: types.CallbackQuery):
        if callback.data == 'b1':
            await callback.message.answer('Вы нажали на button 1')
        if callback.data == 'b2':
            await callback.message.answer('Вы нажали на button 2')
    
        # Заглушка, чтобы кнопка не мигала после нажатия
        await callback.answer()
    
    executor.start_polling(dp)
    Ответ написан
    1 комментарий
  • В чем я ошибся в решении задачи VK EDUCATION?

    @codingoleg
    Ваше решение технически верное, но имеет 2 недостатка, особенно для больших массивов и/или частых операций.
    Во-первых, вы создаёте копию массива для итерации (arr[::-1]), который занимает памяти столько же, сколько оригинальный массив. Во-вторых, вы удаляете элементы из массива по значению (remove), а не по индексу (del), что существенно замедляет выполнение. Рекомендую ознакомиться, как массив устроен под капотом и временную сложность добавления, вставки, изменения и удаления в него. Отсюда также будет понятно, почему одновременная итерация в прямом порядке с помощью цикла for и удаление элементов из массива - это плохая идея. Вот вам 4 функции с бенчмарками, из которых первая ваша:
    import random
    import time
    
    
    def func(arr, el):
        for i in arr[::-1]:
            if i == el:
                arr.remove(el)
        return len(arr)
    
    
    def remove_reverse(arr, el):
        for i in reversed(arr):
            if i == el:
                arr.remove(el)
        return len(arr)
    
    
    def del_by_index_reverse(arr, el):
        for i in reversed(range(len(arr))):
            if arr[i] == el:
                del arr[i]
        return len(arr)
    
    
    def del_by_index_while(arr, el):
        i = 0
        while i < len(arr):
            if arr[i] == el:
                # Удаляем значение по индексу и не сдвигаем указатель i
                del arr[i]
            else:
                i += 1
        return len(arr)
    
    
    # Создаем массив из 100000 случайных цифр от 0 до 9 и сделаем по копии для каждой функции
    arr1 = [random.randint(0, 9) for num in range(100_000)]
    arr2 = arr1[:]
    arr3 = arr1[:]
    arr4 = arr1[:]
    el = 5
    
    start = time.perf_counter()
    print(func(arr1, el))
    print(time.perf_counter() - start)
    
    start = time.perf_counter()
    print(remove_reverse(arr2, el))
    print(time.perf_counter() - start)
    
    start = time.perf_counter()
    print(del_by_index_reverse(arr3, el))
    print(time.perf_counter() - start)
    
    start = time.perf_counter()
    print(del_by_index_while(arr4, el))
    print(time.perf_counter() - start)
    Ответ написан
    Комментировать
  • Как обернуть в цикл консольную программу на Python?

    @codingoleg
    Оборачивать весь код в бесконечный цикл не надо. Нужно обернуть лишь ту часть/функцию, которую вы хотите повторить. Пример кода с отображением номера стороны и треугольника и без повторов (заменить в вашем коде, начиная с try):
    # Функция для подставления номера стороны и номера треугольника для отображения
    def enter_length(side_num: str, triangle_num: str):
        return f'Enter the length of {side_num} side of triangle {triangle_num} (cm): '
    
    
    error_msg = 'Error! Please enter an integer or fractional number for the program to work correctly.'
    repeat_msg = "Enter 'Y' for one more triangle or any key to exit: "
    # Номер треугольника
    triangle_num = 1
    while True:
        try:
            sides = []
            # Номер стороны из 3
            for side_num in range(1, 4):
                sides.append(
                    float(input(enter_length(str(side_num), str(triangle_num)))))
            area_of_triangle(*sides)
        except ValueError:
            print(error_msg)
        else:
            response = input(repeat_msg)
            if response == 'Y':
                triangle_num += 1
            else:
                break
    Ответ написан
    Комментировать
  • Как сделать словарь?

    @codingoleg
    Не совсем понятно, какой именно словарь нужен. Вот вам 3 варианта на выбор.
    with open('text_file', encoding='utf-8') as file:
        sorted_list = sorted(word.rstrip() for word in file.readlines())
    
    with open('text_file', encoding='utf-8') as file:
        sorted_dict = {i: word.rstrip() for i, word in enumerate(file.readlines())}
    
    with open('text_file', encoding='utf-8') as file:
        sorted_list_with_index = sorted(
            {i: word.rstrip() for i, word in enumerate(file.readlines())}.items(),
            key=lambda x: x[1]
        )
    Ответ написан
    Комментировать
  • Ошибка доступа 403, Ошибка проверки CSRF. Запрос отклонён. Как её избежать при заполнении и отправлении формы?

    @codingoleg
    Проблема не в Selenium. Через обычный браузер такая же ошибка. Видимо, сайт на Django у них, и забыли кое-какие настройки поправить. Это ж госуха.
    Ответ написан