Ответы пользователя по тегу Python
  • Как вставить единственное значение списка без скобок?

    Vindicar
    @Vindicar
    RTFM!
    Приведённый код синтаксически неверен, да и не должен давать такого поведения.
    Так что то, что ты запускаешь - это не то, что ты приводишь тут.
    Как список объявляешь?
    Случаем не
    numbers = "[3]"?
    Или, может,
    numbers = input() #вводишь [3]

    Потому что в таком случае наблюдаемое поведение будет именно такое, какое ты описываешь.
    Ответ написан
    2 комментария
  • AttributeError: module 'discord.guild' has no attribute 'create_text_channel' Что делать?

    Vindicar
    @Vindicar
    RTFM!
    Потому что речь должна идти не о модуле guild, а об экзепляре класса Guild, который можно найти в атрибуте message.channel.guild.
    Ответ написан
    Комментировать
  • Как сервер различает, запросы сделанные с помощью Python, от запросов сделанные Браузером?

    Vindicar
    @Vindicar
    RTFM!
    1. Просто, но эффективно - заголовки запроса, в т.ч.
    • User-Agent
    • Cookie
    • Referer

    Также легко подделывается.
    2. Использование штук типа prefetch и тому подобных. Если клиент запросил страницу, но не запросил сразу же стили/скрипты на ней - возможно, это бот. Просто, но рискованно (можно забанить обычных людей) и затратно (нужно анализировать отдачу статики).
    3. Исполнение JS-кода - например, предлагает клиенту выполнить фоновый AJAX-запрос, который поставит специальную куку. Минус - работает только со второго запроса. Обходится безголовым браузером типа selenium.
    Ответ написан
    Комментировать
  • Как сделать так, что бы при написании какого-то сообщения в определённый канал, создавался чат в определённой категории?

    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() в цикле?
    Ответ написан