• Как подключить белый ip к домашнему серверу?

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

    Vindicar
    @Vindicar
    RTFM!
    Простой способ: настрой фаервол, чтобы молча дропал все пакеты, отправляемые на эту пару адрес-порт.
    Если прога использует HTTP, она отправит SYN-пакет для установки TCP-соединения и будет ждать ответа SYN-ACK, но не дождётся - и почти наверняка соединение отвалится по таймауту. Дольше чем этот таймаут ты соединение не подвесишь.
    Правила фаервола найти в Панель управления - Брандмауэр - Дополнительные параметры - Правила для исходящего подключения, и дальше можно будет создать правило в деталях. Если я правлиьно понимаю, виндовый фаервол как раз и дропает пакеты для запрещённых соединений, а не посылает им явный RST (отказ).
    Ответ написан
  • Как правильно обработать exception PasswordHashInvalidError?

    Vindicar
    @Vindicar
    RTFM!
    Огранизовать цикл while True, при вводе правильного пароля (т.е. если не было исключения) делать break.
    while True:
        try:
            attempt_stuff_and_things()
        except SomeException as err:
            react_to_error(err)
        else:  # исключения не было
            break
    Ответ написан
    Комментировать
  • Как в python запустить скрипт из venv?

    Vindicar
    @Vindicar
    RTFM!
    activate нужен, чтобы задать алиас для питона и других утилит из текущего окружения, и ещё парочку переменных среды. Каких - можешь увидеть, открыв скрипт activate.
    Если твой скрипт их не использует, то разницы никакой - можешь просто вызывать питон из .venv/bin/python3 и отдавать ему свой скрипт, и всё будет ок.
    Ответ написан
  • Не корректно работает служба для автоматического поднятия SSH туннеля?

    Vindicar
    @Vindicar
    RTFM!
    В [Service] пропиши Type=simple. И ещё, а как работает autossh? Он свой процесс крутит, или форкает новый? Может, ему нужен Type=forking?
    А заодно посмотри, может, стоит указать User, от имени которого будет исполняться ssh-туннель.

    Если что, journalctl -xe покажет последние логи - поищи там упоминания своего сервиса.
    Ответ написан
    6 комментариев
  • Как отправлять сообщения по расписанию с aiogram3?

    Vindicar
    @Vindicar
    RTFM!
    Открываем страницу пакета, читаем пример.
    В конце видим рабочий цикл aioschedule, где периодически вызывается корутина aioschedule.run_pending().
    У тебя этого нет. Т.е. ты планируешь вызов своей корутины, но не выполняешь код, который этот вызов сделает.
    Поскольку у тебя scheduler() вызывается через create_task(), то можно прямо в тело scheduler() дописать что-то типа
    while True:
        await aioschedule.run_pending()
        await asyncio.sleep(0.1)

    Вот только зачем ты делаешь await create_teask()? Это убивает смысл create_task(), так как ты ждёшь завершения созданной фоновой задачи. Вместо этого сохрани таск в глобальную переменную - так он точно не будет собран сборщиком мусора, и ты сможешь при необходимости вызвать метод cancel(), чтобы прервать цикл внутри scheduler().
    Ответ написан
  • Как поменять тайтл и иконку уведомления в win11toast?

    Vindicar
    @Vindicar
    RTFM!
    Ты вообще документацию читал? Хотя бы страницу пакета на pypi? Там полно примеров, в том числе с иконкой, тайтлом, действием по клику, кнопками и т.д.

    Или ты про имя и иконку приложения, которое открыло уведомление?
    Тогда не удивлюсь, если никак, потому что пользователь должен знать какая сволочь спамит на рабочий стол.
    Разве что упаковывать скрипт в exe с кастомной иконкой и названием.
    Ответ написан
  • Как исправить баг socket подключение к двум и более клиентам паралельно через Thread?

    Vindicar
    @Vindicar
    RTFM!
    Журналируй работу программы, выясняй, как она себя ведёт, и где останавливается.
    Кроме того, я бы посоветовал сделать иначе - вызывай accept() в цикле в главном потоке, а новые потоки создавай только тогда, когда клиент подключится, и передавай им сокет клиента как параметр. Тогда не понадобится костыль с is_last_thread_busy.
    Ответ написан
  • Почему не получается замокать декоратор у функции?

    Vindicar
    @Vindicar
    RTFM!
    Мне кажется, ты просто используешь неверный инструмент, пытаясь совместить несовместимое.
    Вариант А
    Ты проверяешь, что у тебя объект нужного типа. Тогда твой декоратор в принципе работает, но вообще-то это задача для статического анализатора кода типа mypy или встроенного в pycharm, а не проверки в рантайме. И тогда нужно забыть про моки.

    Вариант Б
    Ты проверяешь, что у тебя объект имеет нужные поля и методы (duck typing).
    Тогда тебе нужен typing.Protocol в комбинации с typing.runtime_checkable, с помощью которого ты сможешь описать, что должен иметь объект. Затем этот протокол можно будет подсунуть в isinstance() для проверки, и мок, по идее, её пройдёт. Но опять-таки, задача скорее для статического анализатора кода, чем для рантайм-проверки. Если у тебя в принципе неведомо что может быть передано в метод - это простыми тестами не решается.
    Ответ написан
    2 комментария
  • Почему конвертируемый код Python в EXE блокирует антивирус?

    Vindicar
    @Vindicar
    RTFM!
    PyInstaller более старый поставь. Обычно есть задержка между выходом новой версии и её попаданием в белые списки антивирусов. До тех пор работает эвристика, а с точки зрения эвристики PyInstaller ведёт себя как троян-дроппер.
    Ответ написан
    Комментировать
  • Почему при запуске голосового ассистента он завершает свою работу?

    Vindicar
    @Vindicar
    RTFM!
    Ты вызываешь main() до того, как ты её объявил.
    Освой основы языка сначала.
    Ответ написан
  • Как запретить импорт определённого модуля в python-скрипте?

    Vindicar
    @Vindicar
    RTFM!
    Как ты отличишь импорт из скрипта от импорта из библиотеки?
    Можно отреагировать на импорт в момент, когда он происходит - но понять, кто его выполнил, тяжело.
    И даже если ты сумеешь через анализ текущего фрейма стека понять, кто вызвал импорт - импортированный модуль будет закэширован, и скрипт потом сможет обратиться к нему через sys.modules. Так что либо запрещать импорт модуля в принципе (например, через аудит хук), либо разрешать его во всём скрипте.
    Ответ написан
    Комментировать
  • Откуда взялась строка в файле /etc/apt/sources.list?

    Vindicar
    @Vindicar
    RTFM!
    Префикс cdrom: означает, что источник - не репозиторий в сети, а установочный диск/флешка.
    Во время установки ОС с полного образа диска (не с netinst) этот источник был основным. А потом ты вытащил установочную флешку - источник стал недоступен.

    Просто закомментируй эту строку, и apt будет использовать только сетевые репозитории.
    Ответ написан
    1 комментарий
  • Как это работает?

    Vindicar
    @Vindicar
    RTFM!
    f-строки - это способ подставить в строку значение переменной или выражения.
    В фигурных скобках - выражение, чьё значение нужно подставить. После двоеточия идёт указание на то, как это значение вывести.
    Например, f"{i:2d}" означает "выведи значение переменной i как целое число (d), и дополни его пробелами до ширины 2 знака".

    Подробнее в документации на язык, ссылку тебе дали выше.
    Ответ написан
    Комментировать
  • Почему BEFORE и SINCE не работают с числовым значением месяца?

    Vindicar
    @Vindicar
    RTFM!
    Цитата из документации:
    Search mailbox for matching messages. charset may be None, in which case no CHARSET will be specified in the request to the server. The IMAP protocol requires that at least one criterion be specified; an exception will be raised when the server returns an error.

    Иными словами, что тебе вернёт сервер, и как он сообщит (и сообщит ли!) об ошибке - зависит от сервера, либа только оборачивает его ответы в объекты и исключения питона.
    Если сервер решает что "фз что ты ищешь, на, держи всё что есть", то либа это молча и вернёт.
    Ответ написан
    Комментировать
  • Почему auto-py-to-exe долго собирает приложение и что означает TRACE?

    Vindicar
    @Vindicar
    RTFM!
    TRACE - обычно супер-детальные сообщения о ходе работы программы. "Сейчас я делаю вот это".
    Уровень подробности логов обычно настраивается.
    Ответ написан
    2 комментария
  • Изменение ProgressBar по итерациям в функции?

    Vindicar
    @Vindicar
    RTFM!
    Добавь функции ещё один параметр - callback-функцию, которая будет вызываться каждые X итераций.
    Тогда вопрос "как подружить функцию с индикацией прогресса" сведётся к написанию подходящей callback-функции. Условно:
    from time import sleep
    
    def worker(n: int, cb=None):
        for i in range(n):
            sleep(0.2)  # работу работаем
            if cb is not None and i % 5 == 0:
                cb(i, n)  # оповещаем, если пора и если есть что
        if cb is not None:
            cb(n, n)  # последнее оповещение на 100%. можно убрать
    
    # использование
    def callback(i, n):  # callback для вывода прогресса в консоль
        print(f'{i/n:.1%}')  # выводим процент  завершения
    
    worker(50, callback)  # работаем
    Ответ написан
    2 комментария
  • Как сделать функцию в которой в переменной будет много функций?

    Vindicar
    @Vindicar
    RTFM!
    Блок операторов, вынесенный отдельно и именованный - это и есть функция, вообще-то. Читай про ключевое слово def.
    from turtle import *
    
    color("black", "red")
    m = 100
    
    def myfunc():  # мы говорим "существует функция myfunc, не принимающая параметров"
        forward(12*m)  # функция "увидит" переменную m, описанную выше по коду
        right(940)
    
    begin_fill()
    for i in range(4):
        myfunc()  # вызываем нашу функцию
    end_fill()
    canvas = getcanvas()
    cnt = 0
    for y in range(-100*m, 100*m, m):
        for x in range(-100*m, 100*m, m):
            item = canvas.find_overlapping(x,y,x,y)
            if len(item) == 1 and item[0] == 5:
                cnt += 1
    print(cnt)
    done()
    exit()
    Ответ написан
    2 комментария
  • Почему некоторые декораторы жёлтого цвета а "@" голубого цвета на библиотеке disnake?

    Vindicar
    @Vindicar
    RTFM!
    А библиотека и версия питона тут ни причём. Это используемая тобой среда разработки (IDE) так показывает. На работу кода цвет текста в IDE не влияет. =)

    А вот разницу между
    @decorator
    def func():
        ...

    и
    @decorator()
    def func():
        ...

    понимать надо.
    Ответ написан
    7 комментариев