Задать вопрос
  • Почему 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 комментария
  • Почему перестает работать приложение на VPS после закрытия SSH?

    Vindicar
    @Vindicar
    RTFM!
    Я исхожу из того, что VPS под линуксом.
    Потому что когда ты закрываешь соединение, SSH-демон завершает процесс оболочки, который он запустил для его обслуживания (скорее всего это bash), посылая ему сигнал HUP. А твой сервис запущен как дочерний процесс из этой оболочки, и потому тоже получает сигнал HUP. Так как он этот сигнал не обрабатывает, он завершается.

    Если тебе нужно запустить процесс сервиса разово, и больше его не трогать, запускай его такой командой:
    nohup /путь/до/сервиса --параметры --сервиса &
    & позволит оболочке продолжить работу (запустит твою программу "в фоне"), а nohup "проглотит" сигнал HUP и тем самым не даст завершиться твоему сервису, когда ты отключишь сессию SSH. Но если сервис "упадёт", то запускать его придётся снова.

    Если для тебя допустимо запускать сервис вручную, и тебе нужно взаимодействие с сервисом через консоль (ну скажем, прочитать что он туда пишет), используй программу screen (может потребоваться её установить). Что это за программа, погугли сам, но вкратце, она позволяет создать сессию оболочки, которая переживёт отключение. Однако опять же, если сервис упал, screen его обратно не поднимет.

    Предыдущие варианты сойдут для отладки. А если на постоянку, то тебе нужно запускать сервис как демон, при старте VPS (ну мало ли хостер её перезагрузит), так что разбирайся с автозагрузкой. В зависимости от установленного на VPS дистрибутива это может быть скрипт init.d (смотри скрипты в каталоге /etc/init.d), модуль systemd или что-то ещё. Разбирайся, гугли, по этому материалов в сети полно.
    Ответ написан
    3 комментария
  • Как с помощью 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!
    Без кода дать ответ сложно. Вообще выглядит как проблема с non-maximum suppression - грубо говоря, у тебя несколько соседних перекрывающихся окон дают отклик, так как они все содержат лицо. Нужно выбирать окно с самым сильным откликом, и либо отбрасывать, либо объединять сильно пересекающиеся с ним. Кроме того, можно пробовать отсекать те окна, у которых соседей слишком мало.

    Кроме того, признак Хаара всегда состоит из черных И белых прямоугольников равной суммарной площади. Это связано с тем, что он оперирует суммарной яркостью в той или иной области окна. Так что признак с одним чёрным прямоугольником - это не признак. Что-то ты странно сформулировал.

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

    Vindicar
    @Vindicar
    RTFM!
    Igor Pecherskih, читай документацию. Достаточно проверить, есть ли у целевого пользователя некоторый минимальный набор прав модера - и тогда будет непринципиально, как роль модератора называется да и есть ли она вообще.
    Ответ написан
  • Как получить код страницы?

    Vindicar
    @Vindicar
    RTFM!
    Прямо через селениум и ищи, он это позволяет.
    Ответ написан