Задать вопрос
Ответы пользователя по тегу Python
  • Как сделать так, что бы при написании какого-то сообщения в определённый канал, создавался чат в определённой категории?

    Vindicar
    @Vindicar
    RTFM!
    Взять и сделать.
    Если реализуешь бота на базе discord.py, то обрабатываешь событие on_message, и если сообщение подходит под условия, то дёргаешь create_text_channel() / create_voice_channel() или что там тебе нужно.
    Ответ написан
  • Почему бот уходит в offline?

    Vindicar
    @Vindicar
    RTFM!
    time.sleep(37)
    Ни в коем случае. Почитай, как работают асинхронные программы.
    Грубо говоря, пока твой обработчик выполняет синхронный код (что угодно без await), остальная часть программы стоит.
    Так что пока бот спит, он вообще ни на что не реагирует.
    Замени на await asyncio.sleep(37).
    Ответ написан
    1 комментарий
  • Как обойти запрет на отправку Embed сообщения?

    Vindicar
    @Vindicar
    RTFM!
    1. Какие интенты (intents) запрашиваешь?
    2. Выданы ли соответствующие права роли бота в настройках сервера?
    Ответ написан
  • Бот не пишет сообщение при входи участника (дискорд бот). В чём проблема?

    Vindicar
    @Vindicar
    RTFM!
    1. Права у бота точно есть? Участник может запретить приваты не от контактов, например.
    2. Проверь интенты, запрашиваемые ботом, и разрешённые в настройках учетки бота. Бот вообще получает событие on_member_join?
    Ответ написан
    Комментировать
  • Как в регулярке задать диапазон и символы?

    Vindicar
    @Vindicar
    RTFM!
    во-первых, \что-то - это способ задания символа в строке.
    В регулярках этот синтаксис имеет своё значение.
    Как следствие этого конфликта, нужно делать одно из двух.
    re.search("\\d[0-9A-Za-z]{1,5}", data) #удваиваем \
    re.search(r"\d[0-9A-Za-z]{1,5}", data) #используем r-строку, чтобы отключить обычную обработку \

    Ну и да, в "{1,5}" не должно быть пробела.
    Ответ написан
  • Ошибка sqlite3.IntegrityError: UNIQUE constraint failed: users.user_id, что делать?

    Vindicar
    @Vindicar
    RTFM!
    message.from_user.id in cursor.execute('SELECT user_id FROM users')
    На кой нужно делать выборку всех пользователей, чтобы потом питоном искать в ней данные? Используй ключевое слово WHERE, и используй prepared statement для подстановки значения из переменной, а не форматирование строк.

    f'UPDATE users SET user_id = {message.from_user.id} WHERE user_id = {message.from_user.id}'
    "Если id = 1, то сделай id равным 1". На кой?!
    И да, не используй форматирование строк для формирования строки запроса. Используй prepared statements.

    Например так:
    ids = cursor.execute('SELECT user_id FROM users WHERE user_id = ?', (message.from_user.id,))


    > не понимаю в чем проблема
    В недостатке знаний по основам SQL, и в попытке писать ботов, не разобравшись в основах.
    Ответ написан
    2 комментария
  • Ошибка декодирования строки в base64, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Invalid base64-encoded string: number of data characters (1097) cannot be 1 more than a multiple of 4

    У тебя левые данные в декодируемой строке. Какой-нибудь перевод строки (\n) или подобное не затесался в начало/конец?
    Ответ написан
    Комментировать
  • Как найти одно изображение на другом изображении?

    Vindicar
    @Vindicar
    RTFM!
    Терминология для гуглинга: "Локализация объекта методами компьтерного зрения".
    В качестве инструментария можешь использовать opencv. Для питона это pip пакет python-opencv (импортируется под именем cv2).

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

    Подходы существуют разные. Если не требуется дикоре быстродействие, то можно использовать детектор SIFT.
    Тогда у тебя будет алгоритм вида:
    0. Создаёшь детектор (функция cv2.SIFT.create()) и матчер (можно cv2.BFMatcher(), он тормознутый но простой в использовании).
    1. Грузишь образец искомого объекта и преобразуешь изображения (палитра серого, и т.п.)
    2. Вызываешь метод детектора .detectAndCompute(), чтобы получить найденные особые точки (углы и т.п.) и их описание.
    3. Повторяешь шаги 1,2 для анализируемого изображения (сцены).
    4. У матчера вызываешь метод .knnMatch() c n=2. Это даст тебе 2 лучших совпадения между образцом и сценой по каждой особой точке.
    5. Можно просто брать лучшее совпадение, а можно отсеять те особые точки, у которых два ближайших совпадения слишком похожи - они отсеялись.
    Так или иначе, у тебя должен получиться список пар точек вида "точка на образце - найденная похожая точка на сцене".
    6. Используешь функцию cv2.findHomography() или одну из родственных ей, чтобы найти матрицу преобразования. Грубо говоря, она позволит пересчитать позицию пикселя на изображении образца в позицию пикселя на изображении сцены.
    Примерно так, если представить это наглядно (чтобы получить такую картинку, нужно еще несколько шагов, но она передаёт идею).
    homography_findobj.jpg
    7. Дальше ты можешь использовать эту матрицу как хочешь. Например, возьми координаты центра объекта на изображении-образце, и используй её вместе с cv2.perspectiveTransform(), чтобы найти, где на сцене координаты точки центра объекта. Взяв ещё точку (в углу или на краю), сможешь найти ориентацию.

    Проблема в том, что этот подход работает ТОЛЬКО если в сцене не более одного похожего объекта.

    Код не привожу, набросай черновик сам, тогда можно будет его обсудить и подкорректировать. Если что, в сети можно много найти инфы по использованию opencv для решения этой задачи.
    Ответ написан
    4 комментария
  • Остановить поток. Прекратить выполнять задачу?

    Vindicar
    @Vindicar
    RTFM!
    Используй threading.Event.
    import threading
    
    def run(stop: threading.Event):
      while not stop.wait(timeout=1.0): # ожидание и проверка сигнала о завершении
        schedule.run_pending()
    
    stop_event = threading.Event()
    worker = threading.Thread(target=run, args=(stop_event,))
    worker.start()
    #когда надо остановить поток worker
    stop_event.set()

    Прелесть такого подхода в том, что цикл прервётся немедленно по сигналу stop_event, а не тогда, когда закончится очередное ожидание. Также можно заставить несколько потоков использовать один и тот же объект Event.
    Ответ написан
  • Как использовать кастомные эмодзи в кнопках в discord-components discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Где описаны переменные left, right, trash?

    Ну и да, сделайте setlocale() один раз в начале программы, а не десять раз посередине.
    Ответ написан
  • Как на питоне создать функцию по типу "значимый_тип.функция(аргументы)"?

    Vindicar
    @Vindicar
    RTFM!
    Ты просишь что-то типа extension methods из C#?
    Вообще-то это совершенно не питонично и такие хаки лучше не использовать.
    Для обычных классов можно было бы попробовать модифицировать __dict__ класса, или задать атрибут. Атрибут может быть методом, т.е. функцией.
    Но для встроенных классов такой номер не пройдёт, скорее всего, так как их __dict__ доступен только для чтения.
    Ответ написан
  • Почему может не работать оператор write при записи в текстовый файл на Python?

    Vindicar
    @Vindicar
    RTFM!
    Как запускали программу?
    Судя по описанию вы смотрите на окно интерактивного интерпретатора питона.
    Он не должен запускаться при запуске .py файла, так что либо вы как-то не так запускаете, либо питон у вас криво установлен.
    Ответ написан
    Комментировать
  • Не работает код(бот дискорда)?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, ты подставляешь prefix только в последний элемент списка hello_words.
    Во-вторых, ты делаешь client.remove_command('help') и жалуешься, что не работает команда help. Твой собственный метод help() не декорирован как команда или событие.
    В-третьих, почему не использовать существующий фреймворк для команд?

    from discord.ext import commands
    hello_words = ['привет', 'hello', 'прив']
    
    @commands.command(name=hello_words[0], aliases=hello_words[1:])
    async def hello_command(ctx):
        pass #делаешь что хочешь
    Ответ написан
  • Как превратить строку в многомерный массив?

    Vindicar
    @Vindicar
    RTFM!
    Разбить сначала по символу перевода строки (\n), потом каждый кусок разбить по пробелу.
    Гугли методы строки .split() и .splitlines(). Ну и преобразовать в int или float в конце.
    Ответ написан
    Комментировать
  • Как в Windows создать файл с кириллицей в названии файла?

    Vindicar
    @Vindicar
    RTFM!
    The default encoding is platform dependent (whatever locale.getpreferredencoding() returns), but any text encoding supported by Python can be used.

    Так что Ultra-Bad Coder прав. По дефолту на винде у тебя f.txt открывается с кодировкой windows-1251, а в линуксе по дефолту юникод поди.
    Лучше всегда при открытии явно указывать режим и ожидаемую кодировку файла.
    Ответ написан
    Комментировать
  • Как начать логировать ТОЛЬКО то, что я прописал?

    Vindicar
    @Vindicar
    RTFM!
    Определить имена логгеров, используемых библиотеками (поле name в формате сообщения), получить соответствующие объекты через logging.getLogger().
    Потом на выбор
    а) выставить им уровень ERROR, CRITICAL или ещё выше (например, 100500), чтобы обычные записи отсеивались
    б) создать свой Filter, который блокирует все записи, и задать его для этих логгеров через соответствующий метод
    в) выставить им свойство propagate в False, чтобы не пробрасывали свои записи в корневой логгер, который ты настраиваешь.
    Ответ написан
    Комментировать
  • Почему методы класса не работают в цикле?

    Vindicar
    @Vindicar
    RTFM!
    Uno di Palermo, ключевое слово "должен".
    Ты напрасно выбрал logging для этой цели. Он, например, может и не создавать файл, если не было ни одной фактической записи в лог.
    Вот если бы ты использовал обычный open() и писал строки сам, работало бы куда лучше.

    Я уж молчу про то, что файл может не открыться
    • так как диск полон,
    • так как каталог защищён от записи,
    • так как path, school или artist_name содержали символы, недопустимые для использования в пути
    • так как какая-то другая программа удалила файл в промежутке между созданием и открытием
    • так как какая-то другая программа открыла в файл в исключительном режиме
    • и еще по куче причин

    Так что ещё лучше - просто принять к сведению, что операция по открытию файла может потерпеть неудачу в любом случае. И писать программу соответственно. Блок try-catch IOError в помощь.
    Кроме того, зачем пересоздавать wikiart() в цикле?
    Ответ написан
  • Как остановить спам "Пробелом" на сервере после закрытия клиента?

    Vindicar
    @Vindicar
    RTFM!
    while True:
        data = conn.recv(1024).decode('utf-8').lower()
        print(data)

    У тебя сервер вообще не предусматривает выхода из обслуживания клиента. Разве что по исключению, но тогда весь сервер грохнется.
    Не проверяешь, получили ли хоть что-то. Если соединение закрыто, recv() вернёт bytes-объект нулевой длины. Так что проверяй длину, и если она нулевая - прерывай цикл.
    Также в твоем коде ни сервер, ни клиент не предусматривают нормального завершения соединения. Если ты используешь TCP, то нужно вызвать метод s.shutdown(), чтобы дать другой стороне понять, что больше данных не будет, а потом s.close(), чтобы полностью закрыть соединение.
    Для клиента нужно будет определить условие, когда закрывать соединение. Например, если пользовать в ответ на input() ввёл пустую строку.
    Ответ написан
    Комментировать
  • Как сохранять данные пользователя?

    Vindicar
    @Vindicar
    RTFM!
    Можно. Создай БД, используя id пользователя в качестве ключа.
    Смотри модуль sqlite3, а также основы SQL. Просто чтобы понимать, что делаешь.
    Ответ написан
    Комментировать
  • Как удалить сообщения указанного пользователя Discord Python?

    Vindicar
    @Vindicar
    RTFM!
    Либо смириться, что команда ищет твои сообщения среди N последних, а не ищет N твоих последних.
    Либо загрузить историю чата, и найти, сколько сообщений было с момента Nго твоего сообщения.

    Сразу скажу, последнее может быть муторно в реализации и тормознуто на практике. Что, если с момента твоего давнего затираемого сообщения в чате написали 100500 других?
    Ответ написан
    Комментировать