Задать вопрос
  • Yargy-парсер | Как задать интерпретацию рекурсивного правила вывода для извлечения неизвестного числа терминалов в качестве repeatable-атрибута факта?

    Vindicar
    @Vindicar
    RTFM!
    Как я подозреваю, проблема в том, что во всех твоих попытках при повторе SECTION повторяется и правило для заголовка секции - тогда как нужно повторять только правила для тела секции.
    Т.е. я бы сделал что-то типа такого...
    SECTION_CONTENT = forward().interpretation(Node.successors)
    SECTION_NAME = ...
    FEATURE = ...
    SECTION_CONTENT = or_(
        rule(FEATURE, SECTION_CONTENT),
        FEATURE
    )
    SECTION = rule(SECTION_NAME, SECTION_CONTENT)
    Ответ написан
  • Почему не работает публичная сеть на uvicorn?

    Vindicar
    @Vindicar
    RTFM!
    Есть ли роутер? Если да, надо пробросить порт на нём.
    Ответ написан
    1 комментарий
  • Как сделать после ввода сообщения выполнение функции в aiogram?

    Vindicar
    @Vindicar
    RTFM!
    У тебя две функции, которые заявляют "я могу обработать любое сообщение". aiogram использует первую из них, потому что как иначе он поймёт, когда какую использовать?
    Почитай про Finite State Machine и как их использовать в aiogram.
    Ответ написан
    Комментировать
  • Как обработать большой текстовый файл?

    Vindicar
    @Vindicar
    RTFM!
    Зачем ты складываешь строки в список? Почему не писать их сразу в выходной файл?
    with open("sus.txt", "r", encoding='utf-8') as source:
        idx = 1  # номер файла-приёмника
        go = True
        while go:
            with open(f'part{idx}.txt', 'w', encoding='utf-8') as dest:
                for _ in range(500):  # не более 500 строк в каждый файл
                    line = source.readline()
                    if not line:  # пустая строка = конец файла
                        go = False
                        break
                    dest.write(line)
            idx += 1
    Ответ написан
    Комментировать
  • Как бот может переслать все сообщения с канала, в личный чат пользователя?

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

    Vindicar
    @Vindicar
    RTFM!
    Из постановки задачи: тебе надо работать с сообщением, так?
    Открываешь документацию и ищешь класс, описывающий сообщение. Подсказка: обычно такой класс называется Message.
    Внимательно просматриваешь его свойства и методы, ищешь всё, что касается ответов (ключевые слова: reply, response и т.п.).
    Находишь свойство reply_to_message. Читаешь:
    reply_to_message: Message | None
    Optional. For replies in the same chat and message thread, the original message. Note that the Message object in this field will not contain further reply_to_message fields even if it itself is a reply.

    Тип данных (Message | None) и подсказка Optional говорят о том, что в этом поле может лежать либо None (очевидно, если сообщение не является ответом), либо ещё один объект Message (тогда это сообщение, на который был ответ).
    Теперь как разобраться с автором сообщения. Аналогично ищем свойства и методы класса Message по ключевым словам user, author и т.п. Находим свойство from_user.
    from_user: User | None
    Optional. Sender of the message; empty for messages sent to channels. For backward compatibility, the field contains a fake sender user in non-channel chats, if the message was sent on behalf of a chat.

    Достаточно, чтобы понять, что в этом свойстве должен лежать объект, описывающий автора сообщения.

    Теперь осталось собрать вместе логику работы бота:
    1. Бот получает уведомление о сообщении
    2. Бот проверяет, было ли сообщение отправлено в тот чат, где он должен работать (свойство chat)
    3. Бот проверяет, отправлено ли сообщение тобой (свойство from_user)
    4. Бот проверяет, является ли сообщение ответом (свойство reply_to_message)
    5. Бот получает оригинальное сообщение и извлекает его отправителя
    6. Бот банит этого отправителя

    Как забанить пользователя - упражнение для читателя.
    Учись искать и разбираться в документации, без этого навыка никуда.
    Ответ написан
    4 комментария
  • Как создать многопоточную программу обращающиеся к API?

    Vindicar
    @Vindicar
    RTFM!
    Причём тут конкретно многопоточность?
    Если дело в том, что в нескольких потоках трудно координировать обращения к API, то как выше правильно сказали - делайте очередь запросов (например, queue.SimpleQueue) и отдельный поток, который будет эти запросы выполнять с учётом лимитов.

    Например, так: поток-клиент кладёт в очередь словарь вида
    task = {'ready': threading.Event(), 'params': {...тут параметры запроса...} }
    , а потом делает
    task['ready'].wait()
    if 'error' in task:
        ... # реагируем на ошибку
    else:
        ...  # читаем результат из task['result']

    Тогда рабочий поток, реализующий обращения, будет принимать очередное задание из очереди, делать запрос к API согласно содержимому params, потом записывать результат в task['result'] или ошибку в task['error'] и делать task['ready'].set(), чтобы уведомить клиента о том, что его задание завершено.
    Ответ написан
    5 комментариев
  • Как преобразовать эмбеддинг текста в понятный сверточным слоям?

    Vindicar
    @Vindicar
    RTFM!
    Свёрточные слои работают только с изображениями (ну или с картами особенностей, что частный случай изборажений). Они ищут локальные взаимосвязи между соседними элементами изображения.

    Эмбеддинг изображением не является, в нём нет локальных вазимосвязей между элементами - он имеет смысл только при рассмотрении всех элементов эмбеддинга.

    Таким образом, пытаться скормить эмбеддинг напрямую в свёрточный слой довольно-таки бессмысленно.
    Ответ написан
  • Как подключить белый 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. Так что либо запрещать импорт модуля в принципе (например, через аудит хук), либо разрешать его во всём скрипте.
    Ответ написан
    Комментировать