Задать вопрос
  • Как отправлять сообщения по расписанию с aiogram3?

    Vindicar
    @Vindicar
    spencer_spfl, ну а вызов asyncio.create_task(scheduler()) перед main() дядя Гвидо убирать будет? =)
    Написано
  • Как отправлять сообщения по расписанию с aiogram3?

    Vindicar
    @Vindicar
    spencer_spfl, я не вижу, почему оно должно требовать это при прописи в main(). Покажи код и текст ошибки для этого конкретного варианта.
    А насчёт глобальных переменных - читай про ключевое слово global. Впрочем, в твоём случае можно и без глобальной переменной обойтись, оставшись в пределах main()

    async def main():
        logging.basicConfig(level=logging.INFO)
        scheduler_task = asyncio.create_task(scheduler())  # создаём фоновую задачу
        try:
            await dp.start_polling(bot)
        finally:
            scheduler_task.cancel()  # сигналим о прерывании фоновой задачи
            try:
                await scheduler_task  # даём фоновой задаче шанс обработать сигнал о прерывании
            except asyncio.CancelledError:
                pass  # если всё отработало как надо, то await выкинет CancelledError
    Написано
  • Как отправлять сообщения по расписанию с aiogram3?

    Vindicar
    @Vindicar
    spencer_spfl, а с какого перепуга ты делаешь create_task() вне main()?! Конечно, в этот момент у тебя еще не запущен рабочий цикл asyncio - он запускается вызовом asyncio.run() и выполняет корутину, которую ему дали (в твоём случае main()). Эта корутина и будет точкой входа в программу, она и должна запускать всё остальное, что тебе нужно.
    Написано
  • Как исправить баг socket подключение к двум и более клиентам паралельно через Thread?

    Vindicar
    @Vindicar
    VizerViper, ну можно прямо в теле программы.

    def serve_client(client: socket.socket, addr):
        ...  # тут обслуживаешь одно соединение от начала до конца, включая закрытие
    
    def main():
        addr = ("0.0.0.0", 10101)
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.bind(addr)
        server.listen()
        try:
            while True:
                client_sock, client_addr = server.accept()  # ждём соединения
                Thread(
                    target=serve_client,  # какую функцию запускаем
                    args=(client_sock, client_addr),  # передаём ей параметры
                    daemon=True,  # чтобы по завершению главного потока эти потоки тоже завершились
                    name=f'Serving_{client_addr}'  # имя особо не влияет, но для красоты можно
                ).start()
        finally:  # была ошибка, или нас закрыли по Ctrl-C
            server.close()  # закрываем сокет
            ...  # тут мы можем сделать ещё что-то перед закрытием
    
    if __name__ == '__main__':
        main()
    Написано
  • Поможете с написанием бота на Python?

    Vindicar
    @Vindicar
    На какой строке ошибка?
    Ну и с register_next_step_handler() работаешь криво. Там надо указывать функцию (save_min) а ты её вызываешь (save_min()).
    Написано
  • Не корректно работает служба для автоматического поднятия SSH туннеля?

    Vindicar
    @Vindicar
    NekoGami, ну цитата из man autossh
    -f' causes autossh to drop to the background before running ssh. The -f flag is stripped from arguments passed to ssh. Note that there is a crucial a difference between -f with autossh, and -f with ssh: when used with autossh ssh will be unable to ask for passwords or passphrases. When -f is used, the "starting gate" time (see AUTOSSH_GATETIME) is set to 0.

    Единственный способ, которым процесс может "drop to background" - это форкнуть(склонировать с себя) процесс потомок, а потом завершиться самому. Как следствие, systemd видел, что запущенный процесс завершился, и решал "ну ок, служба завершилась, надо перезапускать".
    Для таких случаев и нужен Type=forking - но он имеет смысл только если наша служба всегда себя форкает. Если мы можем попросить её не форкаться (в autossh это значит убрать флаг -f), то тогда проще так и сделать, и использовать Type=simple.
    Написано
  • Не корректно работает служба для автоматического поднятия SSH туннеля?

    Vindicar
    @Vindicar
    NekoGami, а если таймаут убрать? И ещё, а как работает autossh? Он свой процесс крутит, или форкает новый? Может, ему нужен Type=forking?
    Ну и наконец, а зачем autossh и почему нельзя обойтись просто ssh? systemd вполне справится с перезапуском.
    Написано
  • Как поменять тайтл и иконку уведомления в win11toast?

    Vindicar
    @Vindicar
    dysecode, ох. Ну тогда я не уверен, чем тут можно помочь. У меня 11й винды под рукой нет, сам проверить не могу.
    Я подозреваю, что дело в том, что exeшник, упакованный pyinstallerом - это же на самом деле архив, который при запуске распаковывает интерпретатор питона, окружение и твои скрипты, а потом запускает питон для выполнения этих скриптов. Тогда, если винда ставит иконку и название процесса, который и создал уведомление - то всё логично, его создаёт интерпретатор питона...
    В этом случае только менять язык на что-то, что создаёт нормальный exeшник, а не архив. Возможно, сделать два процесса - один занимается пользовательским интерфейсом и написан на C# или чём-то подобном, а второй, питоновский - работает в фоне. Но это то же та ещё конструкция.
    Написано
  • Как поменять тайтл и иконку уведомления в win11toast?

    Vindicar
    @Vindicar
    dysecode, в обоих режимах нет? И при упаковке one-file, и при упаковке one-dir?
    Написано
  • Как поменять тайтл и иконку уведомления в win11toast?

    Vindicar
    @Vindicar
    dysecode, и снова: доки почитай.
    Кроме того, нужно посмотреть, как это работает в режиме one-file или one-dir. Первый даёт один большой exeшник, но потенциально может давать проблемы с иконкой.
    Написано
  • Как поменять тайтл и иконку уведомления в win11toast?

    Vindicar
    @Vindicar
    dysecode, нет, речь идёт про иконку при упаковке EXE-файла. Ты через pyinstaller упаковывал?
    Написано
  • Как поменять тайтл и иконку уведомления в win11toast?

    Vindicar
    @Vindicar
    dysecode, а приложению иконку свою поставил при упаковке?
    Написано
  • Как исправить ошибку с зависимостями в python?

    Vindicar
    @Vindicar
    Сергей Бурдужа,
    вызываю главный скрипт wp.py

    Вот я это и спрашиваю - как ты это делаешь?
    Какой интерпретатор питон ты используешь - системный, или из виртуального окружения?
    Если ты не активируешь окружение, то будет использоваться системный интерпретатор.
    Хотя можно вызвать интерпретатор прямо из .venv/bin/python3, тогда будешь работать в окружении без его активации.
    Написано
  • Как исправить ошибку с зависимостями в python?

    Vindicar
    @Vindicar
    > Теперь при вызове скрипта, появляется ошибка.

    Уточни, как ты вызываешь скрипт?
    Написано
  • Почему при запуске голосового ассистента он завершает свою работу?

    Vindicar
    @Vindicar
    Alwex0920, не стыдно не знать - стыдно не учиться. Дерзай. =)
    Написано
  • Как исправить баг socket подключение к двум и более клиентам паралельно через Thread?

    Vindicar
    @Vindicar
    VizerViper, а в чём с этим проблема? accept() ожидает подключения клиента, и возвращает объект-сокет, ассоциированный с этим клиентом. На этом роль accept() заканчивается. Как ты дальше работаешь с этим сокетом - уже твоё дело. Хоть параллельно, хоть последовательно, хоть асинхронно.
    Написано
  • Почему при запуске голосового ассистента он завершает свою работу?

    Vindicar
    @Vindicar
    Alwex0920, у тебя очень кривая работа с f.
    Во-первых, read() читает ВЕСЬ файл до конца. А значит, если ты записал туда 0 и поставил после него перевод строки, то результат чтения будет "0\n" и "0\r\n", а не "0". Даже если перевод строки не поставлен, будет очень легко ошибиться и поставить его впоследствии. Это можно починить, если сделать strip() прочитанной строке.

    Во-вторых, когда ты делаешь read() или write(), чтение/запись происходит по текущей позиции в файле. После чтения/записи эта позиция сдвигается. Иными словами, у вызова f.read() без параметров есть побочный эффект - текущая позиция чтения/записи файла окажется в конце файла. Как следствие, второй вызов f.read(), который ты делаешь для сравнения с "0", гарантированно прочитает пустую строку. Просто хочется спросить: тебе по пальцу отрубают за использование лишних переменных, или как? Что мешало сохранить результат вызова f.read() в переменную, и дальше работать с ней? Тогда у тебя был бы только один вызов read().

    В-третьих, после вызова read() у тебя позиция чтения/записи будет в конце файла. Так что вызов f.write("1") допишет единицу в конец файла, вместо того, чтобы записать её поверх нуля. А потому у тебя в файле будет записано "01", и твой код снова не сработает

    Ну и в-четвёртых, да - ты ничего не делаешь, если содержимое файла не соответствует твоим ожиданием.
    А потом удивляешься, что программа ничего не делает.
    С учётом этого, ты мог бы организовать код примерно так (ПРИМЕРНО! не списывай его вслепую, а постарайся понять):
    with open("registr.txt", "w+") as f:
        content = f.read()
    content = content.strip()
    if content == "0":
        ...
    elif content == "1":  # почитай, что делает elif
        ...
    else:  # в файле не 0 и не 1
        print('Неожиданное содержимое файла registr.txt!', repr(content))


    А вообще я бы посоветовал освоить модуль configparser или json, и читать/записывать конфиг с их помощью. Не понадобится чёртова прорва текстовых файлов, да и в целом многие вещи они берут на себя.
    Написано
  • Почему row[0] обращается к None объекту?

    Vindicar
    @Vindicar
    Reaper_sds, при таком подходе
    - очень легко словить ошибку или уязвимость в другом месте
    - выполняется два запроса, где хватило бы одного
    - становится тяжело прочитать код
    Лучше сразу приучиться делать как правильно.
    Написано
  • Почему row[0] обращается к None объекту?

    Vindicar
    @Vindicar
    c.execute(f"UPDATE users SET cash = {c.execute(f'SELECT cash FROM users WHERE id = {inter.author.id}') - row[1]} WHERE id = {inter.author.id}")


    Пожалуйста, не надо так делать. Вам что, по пальцу отрезают за каждую промежуточную переменную?
    И не надо формировать запросы через f-строки, для этого есть подстановка параметров в запрос. Будет аккуратнее и безопаснее.
    Написано
  • Почему при запуске голосового ассистента он завершает свою работу?

    Vindicar
    @Vindicar
    Alwex0920, покажи исправленный код и текст ошибки, которую код выводит. Будем разбираться.
    Написано