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

    Vindicar
    @Vindicar
    RTFM!
    1. Первый пользователь посылает сообщение. Запускается копия search_vk() и выполняет синхронный запрос:
    user_data = vk_parser.get_user_data(user_id)
    Пока запрос выполняется, бот стоит, так как код синхронный.
    2. get_user_data() деляет глупости вида
    with open("FIO.txt", "w") as file: #открываем один и тот же файл для любого запроса

    или
    global bio # используем одну и ту же переменную для любого запроса

    Ну и прочие медиа-файлы тоже одни и те же для разных запросов.
    3. Обработчик сообщения первого пользователя доходит до строки
    loading = await message.answer('<b>Идёт поиск</b>')

    Так как это await-вызов, планируется вызов корутины, и асинхронная программа переходит к следующей доступной операции, пока выполняется отправка сообщения. Собранные данные лежат в файлах.
    4. Второй пользователь посылает сообщение. Запускается ещё одна копия search_vk() и тоже выполняет синхронный запрос get_user_data(). Второй вызов get_user_data() перезаписывает данные в файлах.
    5. Обработчик сообщения второго пользователя доходит до строки
    loading = await message.answer('<b>Идёт поиск</b>')

    и засыпает, пока сообщение отправляется.
    6. Тем временем сообщение первого пользователя отправилось. Обработчик получает управление, и отправляет содержимое файлов - которое было перезаписано, заодно закрывая их.
    7. Сообщение второго пользователя отправилось. Его копия search_vk() пытается отправить файлы, но первый обработчик их уже закрыл.
    Дело ещё осложняется сетевым лагом, так что трудно сказать, кто в итоге будет первым.

    Если по прочтению ты ещё не понял, в чём дело, скажу прямо: не используй глобальные объекты, будь то файлы или переменные, в конкурентной среде! Убедись, что каждая копия обработчика запроса имеет свои хранилища для данных! Локальные переменные безопасны, они создаются каждый раз заново. Если не можешь обойтись без файлов на диске, либо используй модуль tempfile, либо привяжи их имена к ID отправителя сообщения, чтобы хотя бы разные пользователи не сталкивались лбами.
    Ответ написан
    Комментировать
  • IndexError: list index out of range.Как решить?

    Vindicar
    @Vindicar
    RTFM!
    В файле есть строка, в которой нет символа ":". Например, пустая строка (возможно в конце файла).
    Ответ написан
  • Не могу понять суть ошибки: TypeError: on_startup() missing 1 required positional argument: 'message'?

    Vindicar
    @Vindicar
    RTFM!
    on_startup(_)
    Ты говоришь, что функция on_startup() ожидает 1 параметр (по имени _).
    Очевидно, она вызывается без параметров.
    Или в какой момент возникает ошибка? Есть ли декораторы на этой функции?
    Ответ написан
  • Как создать окно/полноценное приложение на чистом Python?

    Vindicar
    @Vindicar
    RTFM!
    Если на чистом питоне без tkinter, то кроссплатформенного решения нет.
    Под винду - ctypes + windows api, но это очень, очень мучительное решение.
    Под никсы... вот честно, я фз. Не удивлюсь, если там нужно привязываться к конкретному оконному менеджеру...
    Ответ написан
  • В чем ошибка при использовании replace()?

    Vindicar
    @Vindicar
    RTFM!
    У объекта "открытый файл" действительно нет метода replace(). Этот метод есть только у строк.
    И ты открываешь файл для записи, тем самым опустошая его содержимое.
    И вызов close() не нужен, так как по выходу из with файл закроется автоматически.

    Тебе сначала надо открыть файл для чтения, прочитать содержимое файла в строку и закрыть файл.
    Потом произвести замену. И учти, что replace() вернёт тебе новую строку, а не изменит исходную.
    Потом открыть файл для записи, записать в него новую строку и закрыть файл.
    Ответ написан
    1 комментарий
  • Ошибка при сложении матриц?

    Vindicar
    @Vindicar
    RTFM!
    У тебя в matrix_1 будут строки, а не числа.
    Ответ написан
    1 комментарий
  • Как заносить ники людей из дискорда (discord.py) в базу данных sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, сама идея - плохая, так как ник можно менять. Используй числовой id пользователя вместо ника.
    Во-вторых, никогда не формируй текст запроса через форматирование строк. Используй подстановку параметров.
    Ответ написан
    Комментировать
  • Нужна с помощь с discord.py?

    Vindicar
    @Vindicar
    RTFM!
    f"SELECT id FROM userifo where id={member.id}
    Никогда так не делай.
    А вообще, что ты пытаешься сделать? Перебрать все сервера и занести их участников в БД?
    Во-первых, у класса Client (и у его наследника discord.ext.commands.Bot) есть свойство guilds. Это список отдельных серверов, можешь просто перебрать его for'ом.
    Во-вторых, в sqlite есть синтаксис INSERT ON CONFLICT UPDATE, который позволяет добавить запись или обновить её, если она уже существует, за один запрос а не за два.
    В-третьих, твой алгоритм перебора не сумеет обнаружить участников, покинувших сервер, так как они просто не появятся в списке участников.
    В-четвёртых, если ты не понимаешь, зачем в коде та или иная строка, тебе рано браться за написание ботов. Поучи сначала основы питона, почитай документацию на discord.py, потом вернёшься к теме. Сэкономишь много времени на вопросах.
    Ответ написан
    Комментировать
  • Как правильно вынести функции с декораторами в отдельные файлы и потом загрузить в основной?

    Vindicar
    @Vindicar
    RTFM!
    Завернуть во внешнюю функцию и передать нужные объекты как параметры.
    def setup(handler, bot, app):
        @handler.on_message()
        def do_stuff(event):
            pass
    
        @app.route('/stuff')
        def route_stuff():
            return "stuff"

    Тогда в основном коде делаешь просто
    import my_module
    my_module.setup(handler, bot, app)

    Только нужно гарантировать, что setup() будет вызван строго однажды.
    Ответ написан
    Комментировать
  • Не могу решить задачу в питоне с помощью zip?

    Vindicar
    @Vindicar
    RTFM!
    Ну zip() тут ни к селу ни к городу... но в принципе можно использовать.
    1. Введи строку.
    2. Разбей на слова (split() в помощь)
    3. Найди такое наибольшее N, что длина списка слов больше N*N. Т.е. если в списке 6 слов, то N будет 2, так как при N = 3 нам понадобится 9 слов для таблицы. Найти можно просто, извлеки корень из длины списка и отбрось дробную часть.
    4. Построй список списков. Каждый элемент (т.е. каждый вложенный список) будет одним столбцом таблицы, и будет иметь длину N. Т.е. если оригинальный список слов будет words, то мы получим
    columns = [ words[0:N], words[N:2*N], words[2*N:3*N], ... ]
    и так далее. Так как число вложенных списков равно N, т.е. заранее неизвестно, это нужно будет сделать циклом.
    5. Сделай цикл вида for row in zip(*columns):, тогда у тебя zip() возьмёт сначала первый элемент каждого столбца, и скомпонует из них кортеж row. Потом второй из каждого, потом третий, и т.д.
    6. Строки из каждого кортеж row нужно вывести, разделив пробелом. Тут можно метод str.join() использовать.
    Ответ написан
    Комментировать
  • Как наложить одно изображение на другое в телеграмм боте?

    Vindicar
    @Vindicar
    RTFM!
    Подозреваю, что file - это файловый объект, а не файл на диске. Так что file_path не соответствует никакому пути на твоей машине.
    Ответ написан
  • Возможно как-то запускать ffmpeg не через консоль?

    Vindicar
    @Vindicar
    RTFM!
    К сожалению, большинство библиотек для работы с ffmpeg тупо запускают экзешник с параметрами, тем самым наследуя все его косяки. Так что особого выигрыша тут нет.
    Гипотетически ты мог бы попытаться взять libffmpeg-c или аналог, скомпилировать под нужную тебе платформу (DLL для винды, so для линукса) и использовать модуль ctypes для работы с ней. Но это, боюсь, будет ещё сложнее.
    Ответ написан
    2 комментария
  • Почему or в python не работает?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты не понимаешь как работает or.
    И не ты первый. Мне вот реально интересно, откуда вообще берётся идея, что логический (в первую очередь) оператор можно использовать таким образом? Машинный перевод с русского на питон, что ли? "Если айди равен тому ИЛИ этому"?
    И что ты пытался сделать? Проверить, что iduser не равно ни одному из указанных id? Так тогда тебе не or нужен.
    if iduser != АЙДИ1 and iduser != АЙДИ2:
    Если айдишек много, практичнее будет in.
    if iduser not in [АЙДИ1, АЙДИ2]:
    Ответ написан
  • Почему при запуске бота пишет ошибка sqlite3.OperationalError: near "bazaa": syntax error?

    Vindicar
    @Vindicar
    RTFM!
    В коде каша. С одной стороны, вроде знаешь про плейсхолдеры, но не синтаксис SQL:
    cursor.execute('INSERT OR IGNORE bazaa (user_id, user_name, username) VALUES (?, ?, ?)', (user_id, user_name, username))

    А в другом месте кода с точностью до наоборот.
    INSERT INTO USERS (user_id, username, first_name,  last_name) VALUES ({user}, "{username}", "{first_name}", "{last_name}", "{ctime()}");

    Почитай про синтаксис INSERT и ON CONFLICT и никогда не формируй запросы форматированием строк.
    Ответ написан
  • Как проверить неопределенное количество элементов?

    Vindicar
    @Vindicar
    RTFM!
    Если each - это список, то тогда составь множество строк, соответствующих каждому элементу each.
    Ты не написал, что такое self.strs, так что приходится использовать его.
    strs_each = set( sefl.strs[e] for e in each )
    А дальше просто, если длина strs_each больше 1, то есть разные строки.
    Ответ написан
    1 комментарий
  • Сan only concatenate list (not "str") to list?

    Vindicar
    @Vindicar
    RTFM!
    s2 = values+'@'+keys
    values будет списком, keys (почему keys, когда это отдельный ключ?) - строкой, как и '@'. Собственно, тебе ошибка про это и говорит.
    Что ты вообще ожидал получить в s2?
    Ответ написан
    Комментировать
  • Как добавить парсер в дискорд бот?

    Vindicar
    @Vindicar
    RTFM!
    n = print(item['name'])
    В-первых, ничего не выводит куда?
    Во-вторых, print() выводит данные в стандартный вывод, обычно в консоль. В дискорд через неё ничего не послать.
    Во-третьих, print() всегда возвращает None. Так что n всегда будет None, и присваивание не имеет смысла.
    В-четвертых, почему не использовать нормальный обработчик команд из discord.ext.commands.Bot? Он тоже позволяет реагировать на сообщения, в придачу к остальным полезностям именно для бота. Это при условии, что ты хочешь именно реакцию на сообщение и не согласен обойтись обычной командой.
    В-пятых, если ты не уверен, что такое print(), почему ты пытаешься писать ботов?

    Ну про мелочи, вроде "бот парсит игры только при запуске, и не обновляет информацию в дальнейшем" я не говорю...
    Ответ написан
    Комментировать
  • Как развернуть окно консоли или закрепить его поверх окон при помощи python?

    Vindicar
    @Vindicar
    RTFM!
    Если под Windows, то придётся использовать WinAPI.
    GetConsoleWindow() чтобы получить дескриптор окна консоли.
    SetForegroundWindow() чтобы сделать это окно активным.
    SetWindowPos() вообще для перемещения/изменения размеров окна, но также имеет параметры для задания окна "поверх всех".
    Для вызова функций WinAPI из-под питона смотри модуль ctypes.
    Ответ написан
    Комментировать
  • Что значит check_same_thread? В Python sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    sqlite3 не потоко-безопасна - если ты одновременно обращаешься к базе из нескольких потоков, это может запороть базу.
    Соответственно, по умолчанию библиотека проверяет, что подключение к базе используется тем же потоком, который создал этот подключение - т.е. что оно ограничено рамками одного потока. Если это не так, выбрасывается исключение. Это поведение по умолчанию, чтобы новички потом не плакались "почему у меня иногда база портится?!!"

    Но если ты очень осторожен и не допускаешь одновременных запросов (с помощью синхронизации по мьютексу. например), то можно безопасно использовать одно подключение из нескольких потоков. Тогда можно сказать sqlite "не дергайся насчёт потоков, я знаю что делаю". Вот эту возможность (подавить проверку) и предоставляет параметр check_same_thread = False.
    Ответ написан
    Комментировать