• Как в 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 комментариев
  • Нужно ли (и как) позаботиться о завершении работы нескольких потоков, которые тоже запущены из отдельного потока?

    Vindicar
    @Vindicar
    RTFM!
    Если тебе нужно, чтобы запущенные потоки доработали до конца даже при завершении программы - то можно их просто запустить и оставить.
    Сложности обычно начинаются, когда нужно завершить фоновый поток вместе с главным - фоновый поток должен сам проверять, что пора завершаться, и делать это достаточно часто.
    Ответ написан
    Комментировать
  • Кто знает user-friendly инструмент для поиска по файлам с помощью языковых моделей (RAG)?

    Vindicar
    @Vindicar Автор вопроса
    RTFM!
    AnythingLLM можно попробовать подружить с LM-Studio или с Jan, тогда не придётся возиться с Ollama.
    Но качество работы пока что неудовлетворительное - надо разбираться.
    Ответ написан
    Комментировать
  • Как поменять for i in range на while?

    Vindicar
    @Vindicar
    RTFM!
    Изменяй. Разрешаю.

    Если серьёзно, то учебные задачи надо решать самостоятельно, иначе какой смысл браться?
    Но тут достаточно понимать, что делает for i in range(x): ...
    Это близкий эквивалент такого кода:
    i = 0
    while i < x:
        ...  # тут тело цикла for
        i += 1

    Ответ написан
    Комментировать