Задать вопрос
  • Асинхронные функции и цикл событий. RuntimeWarning: coroutine 'Application.initialize' was never awaited?

    Vindicar
    @Vindicar
    RTFM!
    :0: RuntimeWarning: coroutine 'Application.shutdown' was never awaited
    :0: RuntimeWarning: coroutine 'Application.initialize' was never awaited

    Ты вызываешь указанные функции как обычные (Application.initialize()), а это корутины. Их так вызывать бесполезно. Если ты их вызываешь внутри другой корутины (async def функции), то можешь исправить вызов на await Application.initialize(). Если же ты пытаешься вызвать их из обычной функции (просто def), то все становится куда сложнее...
    Ответ написан
    Комментировать
  • Как воспроизводить код при закрытии приложения?

    Vindicar
    @Vindicar
    RTFM!
    Оставаясь внутри одного процесса - никак. Условно, вызов TerminateProcess() пришибёт целевой процесс без шанса на реакцию, как и некоторые другие ситуации. Ты можешь использовать atexit, как указали выше, но работать с сетью внутри него не получится. Работа с сетью вообще долгая штука.
    Так что единственный вариант - запускать фоновый процесс-мониторилку, корректно отвязав его от основного процесса (чтобы не завершились вместе). Ну и иметь ввиду, что его тоже можно прибить, так что его надо перезапускать совместно. Тогда прибить оба процесса сразу будет труднее, хотя всё ещё возможно.
    Ответ написан
    Комментировать
  • Как в python использовать функции async внутри multiprocessing.Pool?

    Vindicar
    @Vindicar
    RTFM!
    Я очень надеюсь, что у тебя асинхронщина занимается получением данных, а multiprocessing - обработкой. В этом случае тебе не корутины по процессам надо раскидывать, а создавать внутри одной корутины синхронные задачи по обработке. А асинхронке оставить вопросы получение исходных данных/отправки результатов. Так куда практичнее. run_in_executor() в помощь.
    Ответ написан
    Комментировать
  • Какой подход используется для выявления различных отклонений на экг?

    Vindicar
    @Vindicar
    RTFM!
    Средства анализа временных рядов? Необязательно нейронки.
    Из нейронок есть рекуррентные сети, к примеру. В любом случае комп зрение тут нужно только чтобы перевести рисунок ЭКГ в величины напряжений, если это ещё не сделано.
    Альтернативно - Фурье анализ по каждому каналу ЭКГ, и тренируешь обычную нейронку, подавая ей на вход конкатенацию полученных спектрограмм.
    Ответ написан
    Комментировать
  • Как изменить текст в консоли питона?

    Vindicar
    @Vindicar
    RTFM!
    По пунктам:
    1. со стандартным input() такое не прокатит, придётся писать свой или искать сторонние либы.
    2. Если редактировать надо только последнюю строку: вывод символа \r переведёт курсор в начало строки, а \x08 - на один символ влево. Главное, не забудь предотвратить вывод перевода строки, пока не будешь готов. Редактировать предыдущие строки так нельзя.
    3. curses позволяет делать ОЧЕНЬ много, вплоть до отдельных окон в одной консоли, но под виндой из коробки не работает. Вроде был пакет windows_curses, который добавляет поддержку виндового терминала.
    Ответ написан
    1 комментарий
  • Почему не работает apscheduler?

    Vindicar
    @Vindicar
    RTFM!
    Так как ты не показал инициализацию scheduler, то спрошу: scheduler.start() не забыл вовремя вызвать?
    Также есть совет увеличить детализацию логов для скедулера.
    Ответ написан
    Комментировать
  • Хочу сделать проверку: есть ли канал на сервере или нет в функции для добавления его в БД?

    Vindicar
    @Vindicar
    RTFM!
    Если бот находится на этом сервере, то просто запрашиваешь канал через bot.get_channel() и потому уже проверяешь channel.guild.id на полученном канале.
    Если бота на сервере нет, то я без понятия, возможно ли получить информацию о сервере. Я бы предположил что нет.
    Ответ написан
  • Почему Python выдает ошибку в строке с newPosition?

    Vindicar
    @Vindicar
    RTFM!
    А какого баклажана ты пишешь несколько команд в одну строку? Не надо так делать.
    Ответ написан
  • Как заставить бота регулярно отправлять сообщения на канал в определённое время?

    Vindicar
    @Vindicar
    RTFM!
    Почитать про asyncio.create_task() и как им пользоваться.
    Создаёшь таск при старте бота (читаем доки на диснейк как реагировать на старт бота), в таске крутишь while True: в комбинации с asyncio.sleep(), пока не наступит нужный момент. Затем делаешь что нужно, и снова ждёшь.
    Оговорка 1

    1. Сохрани результат create_task() в переменную (глобальную или атрибут класса бота, если у тебя класс). Иначе со временем сборщик мусора соберёт объект задачи и задача прибьётся.
    2. Перед запуском фоновой задачи проверяй, а не запущена ли она уже. Вроде как on_startup() может вызываться неоднократно при некоторых обстоятельствах.
    3. При выходе из бота берешь этот объект задачи и делаешь что-то типа
    my_bg_task.cancel()
    try:
        await my_bg_task
    except asyncio.CancelledError:
        pass

    чтобы дать фоновой задаче спокойно завершиться.

    Оговорка 2

    Если у тебя только одна задача с ожиданием, то можно ждать самому, через asyncio.sleep(). В противном случае может пригодиться aioschedule или подобная библиотека. Тогда в фоновой задаче крутишь рабочий цикл этой библиотеки, а свои задачи планируешь уже через неё.
    Ответ написан
    1 комментарий
  • Как завершать программу анимированной гифкой?

    Vindicar
    @Vindicar
    RTFM!
    У тебя в коде полно вызовов third_window.grab_set(), хотя а) никакого третьего окна ты не показал и б) даже в коде, который относится к дургим окнам. Копипаст подвел, или так задумано?
    Ответ написан
  • При нажатии на button, вызвать cmd?

    Vindicar
    @Vindicar
    RTFM!
    Вызвать CMD где?
    На сервере - не вопрос вообще.
    На машине клиента - без предустановленного ПО не вариант, и слава богу что так.
    Ответ написан
    2 комментария
  • Как решить задачу на определения ближайшего др сотрудника?

    Vindicar
    @Vindicar
    RTFM!
    # Проверяем, попадает ли день рождения в диапазон
    if start_date <= birth_day_month <= end_date:
        birthdays.append((birth_day_month, name, surname))

    А с какого перепуга ты в список birthdays добавляешь модифицированную дату birth_day_month вместо оригинальной birth_date?
    Ответ написан
    Комментировать
  • Как избежать появления loop pyrogram?

    Vindicar
    @Vindicar
    RTFM!
    Чётко следить за тем, сколько у тебя в программе рабочих циклов (event loop). Такое возможно, в первую очередь, в многопоточной программе. Многопоточность+asyncio вообще тема нетривиальная.
    В связи с этим вопрос: что такое app=apps["My_loveroud"] и что происходит выше по коду?
    Ответ написан
  • Как добавить комментарий к карточке?

    Vindicar
    @Vindicar
    RTFM!
    Погоди, у тебя параметр id откуда должен браться, и как передаваться?
    ЕМНИП, параметры метода-обработчика - это в первую очередь GET-параметры. А у тебя в url для роута параметры не прописаны.
    Если ты берёшь id из поля формы, то убери его из параметров, и бери его аналогично text.
    Ответ написан
  • Как исправить ошибку: (init__.py:7144 MainThread) ERROR TeleBot: "message_handler: Commands filter should be list of strin gs (commands), unknown typ?

    Vindicar
    @Vindicar
    RTFM!
    Commands filter should be list of strings

    @bot.message_handler(commands={'start'})
    У тебя commands - не список, а множество (set).
    Ответ написан
    Комментировать
  • Каков должен быть sys.path у чистого Python 3.1x под Windows?

    Vindicar
    @Vindicar
    RTFM!
    [
      '', 
      'D:\\Python312\\python312.zip', 
      'D:\\Python312\\DLLs', 
      'D:\\Python312\\Lib', 
      'D:\\Python312', 
      'D:\\Python312\\Lib\\site-packages', 
      'D:\\Python312\\Lib\\site-packages\\win32', 
      'D:\\Python312\\Lib\\site-packages\\win32\\lib', 
      'D:\\Python312\\Lib\\site-packages\\Pythonwin'
    ]
    Ответ написан
    Комментировать
  • Классы. Принцип работы __add__ с __radd__?

    Vindicar
    @Vindicar
    RTFM!
    1. Пытается отработать x + y. Вызывается x.__add__(y) (или, что то же самое, Commuter5.__add__(x, y)).
    2. Внутри кода __add__() вычисляется выражение self.value + other. Вызывается self.value.__add__(other)(int.__add__(self.value, other), так как self.value содержит целое число).
    3. int понятия не имеет, что такое Commuter5 и как с ним складываться. Его __add__() возвращает NotImplemented. Питон понимает, что от int помощи не дождёшься.
    4. Поэтому вызывается other.__radd__(self.value).
    5. Внутри этого метода вычисляется выражение self.value + x. В данном случае x - это self.value для первого операнда, т.е. число. self.value - тоже число. int знает, как складываться с другим int, и выражение даёт int.
    6. Отрабатывает конструктор Commuter5() внутри __radd__(). Создаётся новый экземпляр класса, и возвращается как результат вызова __radd__().
    7. Отрабатывает конструктор Commuter5() внутри __add__(). Результат (ещё один экземпляр Commuter5) возвращается наружу.
    8. z присваивается результат, возвращённый вызовом __add__().

    По-моему, в коде ошибка, так как в результате у нас окажется, что внутри Commuter5() будет ещё один объект Commuter5(), внутри которого уже будет сумма. Ты можешь проверить это достаточно просто:
    print(type(z.value))
    Если выведет <class Commuter5 ...> - значит, я прав.
    Чтобы это исправить, операторы __add__() и __radd__() должны проверять, что получилось в результате суммирования, и не заворачивать результат в Commuter5() еще раз.
    Ответ написан
    2 комментария
  • Не работает aioscheduler, aiogram 3. Как сделать что бы работал?

    Vindicar
    @Vindicar
    RTFM!
    @dp.message(CommandStart())  # обработчик события!
    async def dejur(message: Message):
        ...
    
        aioschedule.every().minute.do(dejur)  # планируем вызов функции

    Запомни раз и навсегда - никогда не вызывай обработчики событий напрямую.
    Если тебе нужно реализовать одну и ту же функциональность и в обработчике, и где-то ещё - вынеси эту функциональность в отдельную подпрограмму, и уже её вызывай и в обработчике, и в других местах.
    В твоём случае можно сделать что-то типа такого:
    async def send_duty_list(chat: int):
        print(1)
        global n,skipper
        if weekday():
            await bot.send_message(chat, text=f"Дежурные: {spisok[n]}")
            if skipper == True:
                if n!=14:
                    n = n+1
                else:
                    n=0
                return n
            else:
                skipper = True
                return skipper
    
    @dp.message(CommandStart())
    async def dejur(message: Message):
        await send_duty_list(message.chat.id)  # шлём ответ в тот же чат, где была команда
    
    
    async def scheduler():
        aioschedule.every().minute.do(send_duty_list, chat=1108995102)  # а тут шлём фиксированному юзеру
        while True:
            await aioschedule.run_pending()
            await asyncio.sleep(1)


    Кроме того, имей ввиду:
    async def on_startup(_):
        asyncio.create_task(scheduler())

    У тебя созданный объект задачи может быть собран сброщиком мусора - что, разумеется, прервёт задачу.
    Так что сохраняй ссылку на задачу куда-нибудь в глобальную переменную.
    scheduler_task = None
    
    async def on_startup(_):
        global scheduler_task
        scheduler_task = asyncio.create_task(scheduler())
    Ответ написан
    Комментировать
  • Python pyautogui есть ли решение задачи?

    Vindicar
    @Vindicar
    RTFM!
    Нужно отложить скрипт, взять учебник по Питону, и почитать, что такое исключения и как с ними работать (оператор try-except).
    Тогда станет понятно, почему твой код не работает, и как его поправить.
    Ответ написан
    Комментировать