Задать вопрос
Ответы пользователя по тегу Python
  • Как сделать команду, действующую по разному на разных серверах?

    Vindicar
    @Vindicar
    RTFM!
    Сделать БД или иное хранилище, где ID сервера сопоставлено значение кулдауна, а также время последнего использования команды.
    При вызове команды пытаться выбрать из хранилища строку для сервера, на котором команда была вызвана.
    Если строка есть, проверяем время последнего использования, и вычисляем, прошёл ли кулдаун.
    Если прошёл - то записываем туда новое время, и выполняем команду. Если не прошел, ругаем отправителя команды.

    Если строки нет, решай сам. Можно интерпретировать это как "кулдауна для сервера нет", а можно добавлять в БД строку со значениями по умолчанию.

    В качестве хранилища можно использовать как СУБД, так и что-то попроще. Хоть словарь, который после изменения сбрасывается в JSON файл.
    Ответ написан
  • Как запустить код заново в Python?

    Vindicar
    @Vindicar
    RTFM!
    Про существование цикла while вроде знаешь. В чём вопрос тогда?
    И да, оформляй код по правилам сайта.
    Ответ написан
    1 комментарий
  • Как отсортировать массив экземпляров класса на Питоне?

    Vindicar
    @Vindicar
    RTFM!
    Смотри магические методы __gt__(), __lt__(), __eq__(), __neq__() для сравнения.
    Для реализации оператора [] смотри __getitem__() для чтения и __setitem__() для записи.

    Ну и задавай конкретный вопрос, что не понятно.
    Ответ написан
    3 комментария
  • Почему sqlite3 не сохраняет запись?

    Vindicar
    @Vindicar
    RTFM!
    f'''INSERT INTO {table_name}(date, id, username)
                        VALUES('{date}', '{user_id}', '{username}')'''

    Вот почему бы не почитать хоть какой-нибудь туториал или официальную документацию(начиная со слов "SQL operations usually need to use values from Python variables")?
    Я понимаю динамическое имя таблицы (хотя это тоже сомнительный ход), но уж параметры-то можно вставлять по-человечески.

    А вообще, выбери что-то одно. Если ты осваиваешь SQL, не выделывайся с динамической генерацией запросов, освойся с простыми вещами для начала. Если нет - используй ORM, тот же peewee для начала, пусть он за тебя генерит запросы.

    Ну и до кучи, как ты проверяешь, что в базу ничего не добавляется?
    Ответ написан
    4 комментария
  • Нужно сделать нумерацию Рейтинга игроков в боте я новичок в этом деле, поможете?

    Vindicar
    @Vindicar
    RTFM!
    for n, (user_nick, user_rating) in enumerate(data, 1):
        print(f'{n}. {user_nick} - {user_rating}')

    Под вывод через бота сам перепишешь.
    Ответ написан
    1 комментарий
  • Что с Traceback?

    Vindicar
    @Vindicar
    RTFM!
    BoyFromDubai, тебе же ясно написали:
    бразуеры при открытии страницы сайта делают дополнительный запрос к сайту, чтобы получить favicon. Этот запрос прилетает в ваш обработчик block.

    Т.е. запрос на /favicon.ico браузер сделает по своей инициативе, и тебе придётся с этим иметь дело. Вообще на будущее имей ввиду, что клиент может сделать любой бредовый запрос, так что ВСЕГДА нужно проверять, что тебе пришло.
    Возможных решений 3.
    1. Сменить url запроса, например так.
    @views.route('/block/<height>', methods=['GET'])
    Тогда у тебя запрос не будет конфликтовать с запросом favicon, но всё ещё будет ломаться, если клиент запросит /block/foobar вместо /block/123
    2. Указать тип параметра
    @views.route('/<height: int>', methods=['GET'])
    Тогда фреймворк отфильтрует нечисловые запросы, и сам преобразует стркоу в число. Это умеет и Django, и Flask. Но запрос сломается, если полученное число не будет корректным индексом/ключом для chain[].
    3. Вставить try-except
    try:
        block = blockchain.chain[int(height) - 1]
    except (ValueError, LookupError):
        # ловим ValueError от вызова int() и возможный LookupError от обращения к chain[]
        # хотя я фз что ещё может выбросить chain[]
        return "ОШИБКА БЛИН" # ну или более подробное сообщение об ошибке
    else:
        from main import blockchain
        return render_template("block.html", block = block, blockchain=blockchain)


    Я бы посоветовал сочетание методов 2 и 3. Пусть преобразованием в int занимается Flask, но всё же проверь, подходит ли это число.
    Ответ написан
    1 комментарий
  • Как сделать код более компактным?

    Vindicar
    @Vindicar
    RTFM!
    self.label_20
    Если ты ловишь себя на таком, пора заводить список и хранить ссылки на элементы в нём. Заодно позволит генерить эти элементы динамически.
    Ответ написан
    Комментировать
  • Вместо дуги рисуется линия. Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    По-моему, ты некорректно передаёшь параметры в create_line().
    To create a canvas line object on a canvas C, use:
    id = C.create_line(x0, y0, x1, y1, ..., xn, yn, option, ...)
    The line goes through the series of points (x0, y0), (x1, y1), … (xn, yn).
    Ответ написан
    Комментировать
  • Попытался сделать класс, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Конструктор кога не принимает никакого ctx, только bot.
    Ответ написан
  • Где я поймал invalid syntax?

    Vindicar
    @Vindicar
    RTFM!
    У тебя в приведенном тексте программы кавычки "двойные", а в сообщении об ошибке `бэктики`.
    Какой из двух вариантов у тебя на самом деле?
    Бэктики в питоне не используются, только "двойные" и 'апострофы'.

    Ну и да, не начинай учиться с ботов.
    Ответ написан
  • Как удалить библиотеку с Python?

    Vindicar
    @Vindicar
    RTFM!
    Конечно, команды UNISTALL нету.
    Есть команда UNINSTALL.
    Ответ написан
    2 комментария
  • Как с помощью python вызвать функцию другой программы по ее адресу в памяти?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, получить ее возвращаемое значение - это слишком обще. Одно дело - получить целое число, другое дело - получить объект или строку.
    Во-вторых, речь про программу или про библиотеку? Всё-таки есть разница.

    Если речь про программу, то встаёт ещё несколько вопросов.
    Исходи из того, что целевой процесс тебе придётся запускать самому. Иначе у тебя не будет прав на манипуляции с ним. Да и тогда программа может сопротивляться отладке.
    Далее, вопрос про поток исполнения. Если ты можешь позволить себе запустить отдельный поток, и функция отработает нормально в контексте отдельного потока (нет состояний гонки, нет проверок и т.п.), то это будет проще.
    Если же тебе нужно выполнить код в контексте главного потока, тебе придётся как-то поймать момент, когда главный поток можно прервать для исполнения твоего кода.

    Без ответов на эти вопросы детали предоставить трудно.

    Ты можешь посмотреть библиотеку Detours, она вроде многие вещи автоматизирует, но она для C++. Pymem может помочь, но нужно посмотреть, получится ли подружить его с ctypes.
    Но общий алгоритм и используемые winapi-функции я опишу.
    1. CreateProcess() для запуска целевого процесса как дочернего. Это самый простой способ получить права на его изменение.
    2. VirtualAllocEx(), чтобы выделить память в адресном пространстве этого процесса. Память может быть нужна как для данных, так и для исполняемого кода (нагрузки).
    3. Сформировать нагрузку в машинном коде, которая бы выполняла вызов требуемой функции. Может потребоваться знание соглашения о вызове целевой функции, чтобы подготовить регистры и стек перед вызовом, и корректно очистить их после вызова.
    4а. Если хочешь создавать поток, то твоя нагрузка должна быть функцией с сигнатурой вида:
    int __stdcall payload(LPVOID param)
    читай про конвенцию stdcall, чтобы понять, как это должно выглядеть в машинном коде на целевой платформе. Создав такую функцию, передаёшь её в CreateRemoteThread() для запуска потока.
    4б. Если хочешь вызвать целевую функцию в главном потоке, тебе еще придётся почитать про SuspendThread(), ResumeThread(), GetThreadContext() и SetThreadContext(). Грубо говоря, останавливаешь поток, запоминаешь его контекст (где он сейчас находится), перенастраиваешь контекст так, чтобы выполнение продолжилось с твоей нагрузки (меняешь регистр EIP/RIP), и возобновляешь поток. Твоя нагрузка, в свою очередь, должна просигналить твоему внешнему коду, что она завершила работу, и уйти в вечный цикл. Тогда внешний код должен снова остановить поток, вернуть старый контекст, и возобновить поток. В этом случае твоя нагрузка может быть просто кодом, а не функцией.
    4в. Ещё можно выполнить код при инъекции библиотеки в процесс, в рамках DLLMain(), но этот код, ЕМНИП, сильно ограничен в том, что он может делать. Хотя он наверняка сможет запустить новый поток, а тот поток уже будет делать что сочтёт нужным.

    В любом случае это всё куда проще сделать на C/C++ чем на питоне. Можно ли провернуть такой фокус только через pymem и ctypes, я не знаю. Насколько я знаю, pymem делает вариант 4a чтобы засунуть интерпретатор питона внутрь целевого процесса, и выполнять код в контексте этого процесса. Так что может и прокатит.
    Ответ написан
    1 комментарий
  • Не понимаю, почему код где-то застревает и не выполняется?

    Vindicar
    @Vindicar
    RTFM!
    sock.listen(1)
    listen() достаточно сделать 1 раз, чтобы переключить сокет в слушающий режим.
    Параметр указывает, сколько клиентов могут одновременно ожидать ответа на попытку соединения. Если эта очередь переполнится (клиенты подключаются, а твоё приложение их не успевает принимать), то последующие клиенты автоматически получат отлуп вместо ожидания.

    thread_listen_client = Thread(target=listen_client())
    Ты запускаешь поток, телом которого является значение, возвращаемое функцией listen_client(). Т.е. функция listen_client() выполняется сразу же, а поток уже не запускается, так как возвращённый listen_client() None - это не функция. Осознай разницу между ссылкой на функцию (listen_client) и вызовом функции (listen_client()).

    Ну и наконец, у тебя listen_client() обслуживает клиента, и только потом пытается принять следующее подключение. Как следствие, клиенты будут обслуживаться только по одному (хотя в твоём случае обслуживание очень быстрое и это будет незаметно). Смысл вообще городить потоки?
    Ответ написан
  • Как вывести все из скобок, но внутри них могут имеется и другие?

    Vindicar
    @Vindicar
    RTFM!
    В общем надо выводить весь текст из скобок с соблюдений вложений.

    В общем случае невозможно. Всегда можно составить такую строку, на которой твоя регулярка споткнётся.
    Нужно идти по строке и считать уровень сложенности скобок.
    Ответ написан
    Комментировать
  • Как исправить "pymysql.err.ProgrammingError: Cursor closed"?

    Vindicar
    @Vindicar
    RTFM!
    async with conn.cursor() as cur:
    По выходу из with курсор будет гарантированно закрыт, независимо от способа выхода. А у тебя дальше идёт
    await cur.execute(f'INSERT INTO profile(uid) VALUES(uid)')

    Либо внеси эту операцию внутрь with, либо создай под неё новый курсор.
    Ответ написан
    6 комментариев
  • Замена вхождений regex, разбирая каждое вхождение в Python?

    Vindicar
    @Vindicar
    RTFM!
    Читаем доку.
    The sub() method takes a replacement value, which can be either a string or a function, and the string to be processed.
    replacement can also be a function, which gives you even more control. If replacement is a function, the function is called for every non-overlapping occurrence of pattern. On each call, the function is passed a match object argument for the match and can use this information to compute the desired replacement string and return it.


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

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

    Vindicar
    @Vindicar
    RTFM!
    Прямо через селениум и ищи, он это позволяет.
    Ответ написан
  • Как сделать динамическую slash команду disnake?

    Vindicar
    @Vindicar
    RTFM!
    Т.е. ты хочешь чтобы в команде автоматически предлагался список доступных серверов и т.п.?
    Никак. Особенно с учётом того что команда (а значит, и её параметры) регистрируется при старте бота, а со временем этот список всё равно может измениться и потерять актуальность.
    Ответ написан
    4 комментария