Ответы пользователя по тегу Python
  • Как скомпилировать .exe файл Python?

    Vindicar
    @Vindicar
    RTFM!
    Поставь более старую версию pyinstaller, она наверняка уже в базах антивируса как "не вирус", тогда как новая - ещё нет.
    Ответ написан
  • Как сделать, чтобы бот считывал кол-во втрок в БД и выводил в сообщении разное кол-во строк (в зависимости от кол-ва строчек в бд) на aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Скажи пожалуйста, как ты дошел до написания ботов, не зная, что такое конкатенация строк? >_<
    Любой из вариантов по ссылке можно применить к решению твоей задачи, это самые азы языка, черт побери.
    Ответ написан
    3 комментария
  • Пишу код для Telegram Бота, как не делать тупые ошибки?

    Vindicar
    @Vindicar
    RTFM!
    От того, что ты объявил функцию внутри другой функции, никакой магии не случится. Бот не узнает про неё, и не поймёт сам, что теперь её нужно вызвать.

    Тебе нужно читать про register_next_step_handler(), ну или посмотреть официальный пример на тему.
    Ответ написан
    1 комментарий
  • Зачем нужны потоки?

    Vindicar
    @Vindicar
    RTFM!
    Потоки имеют смысл, когда тебе нужно быстро и дёшево выделить синхронный код в отдельную единицу исполнения без заморочек межпроцессной коммуникации. Иными словами:
    - если выносимый код исполняется в течении длительного времени
    - если нет возможности или желания переделывать выносимый код в корутину, а хочется оставить вытесняющую многозадачность
    - если обмен данными с этой корутиной достаточно сложен, чтобы сериализация/десериализация не окупалась (хотя shared memory может помочь).
    - если код не нагружен вычислениями (в связи с GIL)

    В общем, потоки - это простое и ленивое решение.

    Пример раз: асинхронное приложение, но с GUI без поддержки асинхронщины. GUI требует рабочий цикл, asyncio требует цикл-реактор, подружить их в одном потоке трудно, а вытащить GUI в отдельный процесс может потребовать заморочек с организацией взаимодействия. Проще запустить GUI-цикл в отдельном потоке и работать с ним там. (Хотя иногда есть хаки, позволяющие обновлять GUI в рамках "while True:" корутины.)

    Пример два: асинхронная работа с файлами. Насколько я знаю, в питоне файлы чисто синхронные, а библиотеки для асинхронного доступа (типа aiofiles) под виндой "жульничают", выполняя синхронные операции как раз в отдельном потоке.
    Да и в целом, если нужно выполнить долгий синхронный код в асинхронном приложении, вынос его в отдельный поток может оказаться наиболее удобным решением.
    Ответ написан
    5 комментариев
  • ModuleNotFoundError: No module named 'telebot', почему?

    Vindicar
    @Vindicar
    RTFM!
    Проект использует системный интерпретатор питона, или виртуальное окружение?
    Ответ написан
  • Как сделать команду, действующую по разному на разных серверах?

    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!
    В общем надо выводить весь текст из скобок с соблюдений вложений.

    В общем случае невозможно. Всегда можно составить такую строку, на которой твоя регулярка споткнётся.
    Нужно идти по строке и считать уровень сложенности скобок.
    Ответ написан
    Комментировать