Задать вопрос
  • Не корректно работает служба для автоматического поднятия 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
    > Теперь при вызове скрипта, появляется ошибка.

    Уточни, как ты вызываешь скрипт?
  • Как исправить баг 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, покажи исправленный код и текст ошибки, которую код выводит. Будем разбираться.
  • Как получить координаты предмета на скриншоте?

    Vindicar
    @Vindicar
    Artem Mikhniuk, я выше написал - используй пакет pywinauto, например.
    Разберсть, как им пользоваться, проверь, реагирует ли вообще игра на действия этого пакета, потом дополни свой код, чтобы он не обводил объекты прямоугольниками, а кликал по ним.
  • Как получить координаты предмета на скриншоте?

    Vindicar
    @Vindicar
    Задание, а не вопрос.
    В чём конкретно проблема? Как искал (если вообще искал)?
    Потому что даже по запросу "питон навести курсор мыши" быстро выходишь на пакеты pyautogui и pywinauto.
  • Безопасная система пруфов при открытии лут-боксов?

    Vindicar
    @Vindicar
    Возможен-то возможен, но будет ли толк? Просто юзеры будут верить, что им заранее генерят неправильные лутбоксы с одной фигнёй.
  • Почему у задачи такое решение?

    Vindicar
    @Vindicar
    Naims, у метода slice() два параметра, но второй может быть не указан.
    Первый - индекс начала.
    Второй - индекс конца (если указан). Если не указан, то до конца последовательности.
    Отсюда вывод:
    .slice(-1) означает "возьми элементы, начиная с последнего (-1) и до конца", т.е. "возьми последний элемент".
    .slice(-2, -1) означает "возьми элементы, начиная с предпоследнего (-2) и до последнего (-1) НЕ включительно", т.е. "возьми предпоследний элемент".

    И да, в твоём коде условие else if(word_11.slice(-1) != "ь") лишнее совершенно. Если ты попал в else, значит, условие в первом if не выполнилось, а значит, слово не заканчивается на мягкий знак.
  • Работа с txt в python. Как работать с редактированием строк?

    Vindicar
    @Vindicar
    Ну в данном случае выглядит норм - файл изменять-то не требуется, только извлечь символы из каждой строки. И хотя питон тут избыточен, кому что удобнее...