Задать вопрос
  • Как выйти из цикла при вводе определенного слова?

    Vindicar
    @Vindicar
    RTFM!
    Если вам нужен пассивный цикл, в духе "ждём ввода, ввели exit - останавливаемся, иначе что-то делаем и снова ждём", то решение выше подойдёт.
    Если вам нужен активный цикл, который что-то делает пока пользователь ничего не ввёл, то input() не подойдёт.
    Можно соорудить что-то с потоками:
    1. главный поток запускает второй поток, который выполняет тело цикла
    2. главный поток уходит в input()
    3. по выходу из input() посылаем сигнал второму потоку остановиться и делаем join(), чтобы дождаться его.
    Ответ написан
    Комментировать
  • В чём может быть ошибка в коде discord.py?

    Vindicar
    @Vindicar
    RTFM!
    > intents = discord.Intents.all()
    Ты просишь интенты как не в себя. Далеко не все они доступны боту сразу, хотя кое-что можно поправить на странице настроек учётки бота в дискорде.
    Лучше просмотри список интентов и разберись, какие тебе нужны, а потом уже запрашивай только их.
    Ответ написан
    1 комментарий
  • Как сделать чтобы строка очистилась в пайтон?

    Vindicar
    @Vindicar
    RTFM!
    Если ты имешь в виду "удалить весь текст из текущего поля ввода", то пошли в окно сначала сочетание Ctrl-A (выделить всё), потом Del. Но сработает только если поле ввода имеет фокус.
    Ответ написан
    Комментировать
  • Как считать время (кулдаун) для команды?

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

    Vindicar
    @Vindicar
    RTFM!
    while ((sel = select(s, &rfd, NULL, NULL, &time_val)) <= 0) {
                            res = sendto(s, dns_datagram, data_curlen, flags, (struct sockaddr*) &addr,
                                    sizeof(struct sockaddr_in));
                            if (res < 0) {
                                    printf("res = %d\nError. Server offline?\n", res);
                                    printf("sel = %d\n", sel); // out 0
                            }
                            FD_ZERO(&rfd);
                            FD_SET(s, &rfd);
                    }

    Первое, почему условие <=0 а не ==0? Возврат -1 означает ошибку, и не должен проглатываться. Таймаут - это именно 0.
    И я вижу косяк в первом аргументе у select.
    nfds This argument should be set to the highest-numbered file
    descriptor in any of the three sets, plus 1. The
    indicated file descriptors in each set are checked, up to
    this limit (but see BUGS).

    Т.е. тебе нужно s+1 туда передать.

    И да, MSDN пишет:
    nfds Ignored. The nfds parameter is included only for compatibility with Berkeley sockets.

    Вот почему под виндой работает.
    Ответ написан
    Комментировать
  • Как узнать какие папки находится в папке?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как работает запись переменных в память в Python?

    Vindicar
    @Vindicar
    RTFM!
    Если по аналогии, то любые переменные - это не более чем указатели на реальные объекты.
    И этими реальными объектами рулит garbage collector питона.
    Разница в том, что некоторые объекты изменяемые (точнее, объекты-ссылки), а некоторые нет (объекты-значения).
    Объекты-значения копируются при попытке модификации:
    a = 1
    b = a
    b += 2
    print(a, b) #1 3

    Объекты ссылки нет:
    a = [1]
    b = a
    b += [2]
    print(a, b) #[1, 2] [1, 2]
    Ответ написан
    Комментировать
  • Как правильно запустить Discord-бота в потоке?

    Vindicar
    @Vindicar
    RTFM!
    Я не в курсе как работает threadSignal.connect(), но я знаю, что bot.run() не вернёт управление, пока бот не завершит работу.
    Т.е. из функции BOT_RUN поток управления не вернётся ещё очень долго.
    Возможно, стоит перепланировать, какой поток что делает? Выделить отдельный поток под bot.run()?
    Ответ написан
    Комментировать
  • TypeError: solve() takes 0 positional arguments but 3 were given как исправить???

    Vindicar
    @Vindicar
    RTFM!
    Подумать головой. Какой именно solve() ты пытаешься вызвать?
    sols=solve([fx,fy],x,y)
    Из какого модуля? Потому что у тебя есть функция
    def solve():
    И программа уже видит только твою функцию.

    Поэтому
    1. переименуй свою функцию
    2. старайся не делать from xxx import *. Сплошная морока с таким подходом, как видишь. Лучше явно вызвать sympy.solve(). То же касается остальных модулей.
    Ответ написан
    2 комментария
  • Проблема с произведением музыки в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Ну подумай головой.
    > 'NoneType' object has no attribute 'play'
    > voice_channel.play(
    Значит, voice_channel - None.
    Смотрим откуда он взялся, читаем доки по Guild.voice_client:
    "voice_client - Returns the VoiceProtocol associated with this guild, if any.
    Type: Optional[VoiceProtocol]"
    Т.е. он вполне может быть None, и это надо проверять перед использованием.

    А вот более интересный вопрос, почему он None.
    Ты выше обращаешься к channel = ctx.author.voice.channel - а ведь не только voice может быть None, но и channel в нём. voice проверяешь, channel нет. А чуть ниже у тебя удивительная конструкция:
    try:
          await channel.connect()
        except:
          pass

    Дай угадаю, channel.connect() кидал 'NoneType' object has no attribute 'connect'?
    Никогда на надо глотать исключения таким образом - всё без разбора и без реакции.
    channel.connect() кидает ровно три возможных исключения, и их нужно обрабатывать по-нормальному!
    asyncio.TimeoutError – серверу икнулось, мы ничего сделать не можем, только попросить пользователя повторить по-позже.
    ClientException – мы уже к войс-чату подключены, нужно либо переключаться, либо просить подождать, пока закончим с первым запросом.
    OpusNotLoaded – библиотеку opus не загрузил, она нужна для работы с голосом.
    Ещё раз, except: pass - это очень, очень хороший способ выстрелить себе в ногу.

    И самое-то смешное, что в документации на connect() написано что оно возвращает готовый к работе voice_channel. Тогда вроде как не нужно было ctx.guild.voice_client трогать, connect() отдаст нужный объект.
    Ответ написан
    Комментировать
  • Как изменять переменную через время в боте VK?

    Vindicar
    @Vindicar
    RTFM!
    Храни в базе пары "ID пользователя" - "время предыдущей отправки команды", при отправке команды вытаскивать по ID отправившего прошлое время и смотреть сколько с тех пор времени прошло.

    Детали зависят от инструментария, но даже на этом форуме этот самый вопрос неделю или две назад задавали.
    Ответ написан
    Комментировать
  • Почему не видно изменения переменной из процесса Python?

    Vindicar
    @Vindicar
    RTFM!
    И впрямь не надо использовать глобальные переменные. Они свои в каждом процессе.
    Изучите доки по multiprocessing, в частности класс Queue для двусторонней передачи данных.
    Ответ написан
    Комментировать
  • Как сделать так, что бы программа искала ключевые слова в предложениях?

    Vindicar
    @Vindicar
    RTFM!
    Регулярные выражения (модуль re), частности маркер \b - граница слова.
    Регулярка "ворот" найдёт и "ворот", и "поворот", и "воротник"
    Регулярка "\bворот\b" найдёт только "ворот", но не "поворот" / "воротник".

    А вот если вам нужны словоформы ("летел/летаю/лечу/летим"), то задача усложняется.
    Ответ написан
    Комментировать
  • Определитель матрицы nxn Python?

    Vindicar
    @Vindicar
    RTFM!
    Где-то в расчётах получилось NaN - Not A Number.
    Могли поделить на ноль, больше я не вижу операций, которые могли NaN сгенерировать.
    Проверяйте значения матрицы по шагам, что тут ещё скажешь.
    Ответ написан
    Комментировать
  • Как прибавить +1 к значению в sqlite?

    Vindicar
    @Vindicar
    RTFM!
    > Сама ошибка - star = cursor.fetchone()[0]
    > TypeError: 'NoneType' object is not subscriptable

    not subscriptable означает что ты пытаешься взять индекс у объекта, который это не поддерживает. В твоем случае объект типа NoneType - т.е. None.
    Иными словами, cursor.fetchone() вернул None, и конечно у None нельзя взять индекс.
    Почему fetchone() вернул None? Потому что запрос SELECT не нашёл ни одной строки с подходящим значением photo!

    Как это решить?
    Вставить в таблицу строку с photo, а если не получится (так как такое photo уже есть), то обновить. Есть два способа.
    1. Кодом. Проверить, что вернул fetchone(). Если None, то делаем INSERT. Если не None, то UPDATE.
    2. Средствами БД, что обычно называется UPDATE/INSERT, или коротко UPSERT. Для sqlite это потребует примерно такого запроса:
    INSERT INTO stars (photo, star) VALUES (ид фото, 1) ON CONFLICT (photo) DO UPDATE SET star = star + 1

    Требование: столбец photo должен быть первичным ключом или хотя бы иметь уникальный индекс, иначе запрос просто будет добавлять дубликат строки.

    ВАЖНО
    f'SELECT star FROM stars WHERE photo = "{photo}"' - никогда так не делайте! Особенно если входные данные получены от пользователя. Это хороший способ заполучить SQL-инъекцию.
    Используйте placeholders, по порядку:
    cursor.execute('SELECT star FROM stars WHERE photo = ?', (photo, ) )
    или по именам
    cursor.execute('SELECT star FROM stars WHERE photo = :photo', {'photo' : photo} )
    И удобнее и безопаснее.
    Ответ написан
    7 комментариев
  • Как получить https редирект ссылку в запросе get?

    Vindicar
    @Vindicar
    RTFM!
    > переходя на которую происходит 5-ти секундная проверка
    Это означает, что редирект выполняется средствами JS, а не через коды ответа HTTP 3XX.
    requests умеет обрабатывать только последний вариант, так как она не эмулирует браузер целиком.
    Теоретически правильную ссылку можно выцарапать из содержимого скачанной страницы, но на практике не факт - скорее всего, страницу с проверкой ввели как раз для защиты от скриптов типа твоего.
    Можешь поиграться с пакетом selenium, он позволяет притворяться полноценным браузером - вдруг получится.
    Ответ написан
    2 комментария
  • Json представление класса при передаче в метод Python?

    Vindicar
    @Vindicar
    RTFM!
    Гораздо лучше явно добавить метод to_json() в ваш класс, и явно вызывать его.
    Это будет гораздо проще в реализации и понимании.

    __str__() предназначен для человекочитаемого представления, а __repr__(), в идеале, для строкового представления, которое можно eval'нуть обратно в объект.
    Под сериализацию в json они подходят плохо.
    Ответ написан
    Комментировать
  • Какие параметры есть у файла python кроме -i?

    Vindicar
    @Vindicar
    RTFM!
    python /? под Windows
    python --help под Linux
    И читайте внимательно.
    А вообще, вопрос для гугла.
    Ответ написан
    1 комментарий
  • Как написать input для дискорд бота?

    Vindicar
    @Vindicar
    RTFM!
    Простой вариант - параметры команды. Иными словами, задаёшь все исходные данные для выполнения команды в одном начальном сообщении.
    Например,
    > Ты: !скажи 3 Привет
    < Бот: Привет
    < Бот: Привет
    < Бот: Привет
    Если ты используешь discord.py, то она предоставляет очень удобный механизм для таких вещей. Он подробно описан в документации.

    Сложный вариант - пошаговый/диалоговый.
    Тогда тебе придётся помнить для каждого юзера, на каком шаге он находится, и обрабатывать входящие сообщения в зависимости от текущего шага.
    По сути, это конечный автомат.
    Ответ написан
    Комментировать