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

    Vindicar
    @Vindicar
    RTFM!
    Я поддерживаю ответ dooMoob выше, но от себя добавлю: когда разберёшься с потоками, посмотри модуль queue.
    Ответ написан
    Комментировать
  • Как в aiogram передать переменную из одного хэндлера в другой?

    Vindicar
    @Vindicar
    RTFM!
    Поучите основы питона. Вот кроме шуток. Разницу между глобальными и локальными переменными, а также основы работы с классами.
    Иначе сколь-нибудь сложного бота написать будет сложно, а что получится - будет тяжело поддерживать и отлаживать.

    А конкретно по вопросу: нужно в profil() делать запрос вроде SELECT * FROM Users WHERE User_id == message.from_user.id

    И да, не надо формировать SQL-запросы через форматирование строк, это хороший способ выстрелить себе в ногу. Почитайте про работу с placeholders.
    Ответ написан
    1 комментарий
  • Как отправить музыку через bot.send_audio (telebot, python)?

    Vindicar
    @Vindicar
    RTFM!
    Ты используешь pyTelegramBotAPI? Если заглянуть на гитхаб проекта, можно найти любопытный комментарий в одном из issue:
    You can't set title and performer when you are sending audio by url, but there would be no problem if you will do the same with local file

    Т.е. параметры типа title/performer/thumb работают только при загрузке файла, а не ссылки. ФЗ правда ли это, и если да, то почему такое ограничение.
    Ответ написан
    5 комментариев
  • Почему Телеграм api блокирует client.get_entity()?

    Vindicar
    @Vindicar
    RTFM!
    Очевидно, спамишь запросами слишком часто. Тебе точно нужно имя отправителя?
    Ответ написан
  • Как исправить ошибку при запуске?

    Vindicar
    @Vindicar
    RTFM!
    Ну ошибку даже автопереводчик расшифрует: конструктору класса неизвестен аргумент threaded, который ты передаёшь.
    Вот почему он неизвестен - уже интереснее. Это аргумент есть там уже лет 6.
    Опечатки типа русская/латинская "e" я не наблюдаю...
    На всякий случай уточни версию пакета telebot, который у тебя стоит. Последнйи релиз у них - 3.8.1.
    Ответ написан
  • В чем ошибка sqlite python?

    Vindicar
    @Vindicar
    RTFM!
    img2 = open(f'{maxmark[2][0]}', 'rb')
                mime = magic.Magic(mime=True)
                filename = mime.from_file(maxmark[2])


    Строка один подразумевает, что имя файл - это maxmark[2][0]. Тогда maxmark[2] - это наверно, коллекция, кортеж, список или словарь, потому что я не думаю что вы открываете файл с именем из одного символа. К слову, зачем f'{maxmark[2][0]}'?
    Но в строке три судя по названию метода, нужно передать строку с путём к файлу файла - а передаётся туда maxmark[2], которое мы уже определили как возможный кортеж.
    Это совпадает с текстом ошибки.
    Ответ написан
  • Как проверить свернуто ли окно?

    Vindicar
    @Vindicar
    RTFM!
    Насколько я понимаю, на чистом питоне это будет сделать затруднительно. Нужно использовать платформо-зависимые инструменты.
    Если под Windows, то можно использовать WinAPI. Чтобы обращаться к ним под питоном, используй пакет pywin32.
    Функция IsIconic() проверяет, свёрнуто ли окно с указанным дескриптором в панель задач. Передай ему дескриптор окна, которое надо проверить.
    Функция GetForegroundWindow() получает дескриптор окна, которое сейчас в фокусе. Не уверен, идёт ли речь об окне верхнего уровня, или об элементе управления в фокусе (элементы управления - тоже окна). Оно возвращает дескриптор окна, если дескриптор равен желаемому - значит, искомое окно сейчас в фокусе.
    Так как тебе потребуется узнать дескриптор нужного окна, посмотри также FindWindow(). Имя класса окна надёжнее, но его труднее узнать. Заголовок окна может меняться (например, у браузера он зависит от текущей вкладки), но зато его узнать легче. При этом речь идёт о точном совпадении заголовка окна!
    Если заголовок меняется, то стоит использовать EnumWindows(), но с ней сложнее работать.
    Ответ написан
    Комментировать
  • Как добавить к названию переменой символ?

    Vindicar
    @Vindicar
    RTFM!
    temp = [str(res["daily"][i]["temp"]["day"]) for i in range(0, 9)]
    print('Всего:', len(temp))
    print('Все:', temp)
    print('Нулевой:', temp[0])

    Учитесь работе со списками, пригодится.
    Ответ написан
    1 комментарий
  • Есть 2 блока, на погоду и на поговорить. Как сделать так чтоб если я выбрал "Погода" то он показывал погоду без повторного запроса?

    Vindicar
    @Vindicar
    RTFM!
    Храни состояние для пользователя.
    Т.е. для каждого пользователя нужна какая-то структура данных, которая будет хранить информацию - запрашивал ли пользователь погоду (и если да, то в каком городе), находится ли пользователь в режиме разговора, и так далее.
    Кроме того, нужно решить - хочешь ли ты, чтобы бот запоминал это между перезапусками? Если можно ограничиться запоминанием в рамках одной рабочей сессии, то дело упрощается. Если нет, то нужно будет разбираться с базами данных.
    Ответ написан
    Комментировать
  • Не удается скопировать файл через shutil. [Errno 13] Permission denied. Что делать?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, освойте стандартную библиотеку pathlib для работы с путями, будет намного проще. В частности, посмотрите в сторону Path.expanduser().
    Во-вторых, разберитесь с параметром exist_ok в функциях создания каталога и копирования, чтобы не писать if'ы для создания директорий.
    В-третьих, copyfile() работает только с файлами, как следует из названия. Она не понимает, что делать с директорией. Поведение, которые вы ожидаете, даёт функция shutil.copytree().
    Ответ написан
    Комментировать
  • Как решить проблему с правами бота в discord py?

    Vindicar
    @Vindicar
    RTFM!
    Чужие сообщения редактировать нельзя. См. тут.
    Raises

    HTTPException – Editing the message failed.

    Forbidden – Tried to suppress a message without permissions or edited a message’s content or embed that isn’t yours.

    Ответ написан
    Комментировать
  • Почему все словари с списки пустые, кроме первого?

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

    Измените код так, чтобы у каждого пользователя был свой словарь, и раскладывайте данные по ним. Например, сделайте словарь верхнего уровня, где ключ - id_пользователя.
    Ответ написан
    Комментировать
  • Как правильно продумать архетектуру бота?

    Vindicar
    @Vindicar
    RTFM!
    Ответ зависит от сложности парсинга, на самом деле.
    Если у вас в парсинге большую часть времени занимает общение с сайтом, а затраты на сам парсинг минимальны, то можно обойтись без многопоточности, если использовать что-то типа aiohttp.
    Оно может работать в одном рабочем цикле (реакторе) с остальным ботом, и не подвешивать его на время запроса к сайту.
    Если же в парсинге значительную долю времени занимают вычисления, то тут уже нужна многопоточность, или даже многопроцессность.

    Наконец, стоит использовать либо asyncio.Queue (без потоков) либо queue.Queue (с потоками), чтобы организовать передачу итогов парсинга боту. В первом случае бот может просто в цикле await'ить метод get() очереди, и по получению очередного блока данных формировать и отправлять сообщение.
    Ответ написан
    Комментировать
  • Я делаю код для парсинга сайтов и мне выдает ошибку name 'html' is not defined как мне это пофиксить?

    Vindicar
    @Vindicar
    RTFM!
    В Питоне имена переменных чувствительны к регистру, HTML и html - это две разные переменные.
    Ответ написан
    Комментировать
  • Как исправить бота с несколькими потоками?

    Vindicar
    @Vindicar
    RTFM!
    Я бы посоветовал использовать asyncio.Queue, но там есть тонкости при работе с несколькими потоками.
    Пусть поток-парсер вообще не занимается вопросами работы с ботом, а просто периодически производит парсинг, и если есть новости - кладёт их описание в выходную очередь. Он должен делать это с помощью call_soon_threadsafe(), как описано тут, так как класс asyncio.Queue не является потокобезопасным.
    Зато бот в главном потоке может просто в цикле await'ить метод get() очереди, и отправлять сообщения по получению очередного объекта.

    Альтернатива - использовать классический потокобезопасный queue.
    Так будет проще помещать в него результаты парсинга, но сложнее их извлекать - придётся периодически (типа раз в 1-5 секунд) вызывать метод get_nowait(), чтобы узнать, есть ли что-то в очереди. Блокирующий get() подвесит бота.
    Ответ написан
    3 комментария
  • Как отследить статус выполнения скрипта?

    Vindicar
    @Vindicar
    RTFM!
    Используй пару queue и отдельный поток для обработки ссылок.
    Обработчик читает описание запроса (например, ссылку и id отправителя) из первой очереди, обрабатывает её, и кладёт результат во вторую очередь.
    Основной бот при получении ссылки пытается положить её в первую очередь (можно добавить ограничение на максимальный размер очереди!). Также он должен время от времени заглядывать во вторую очередь. Если там что-то есть, то извлечь результат обработки ссылки, и сделать с ним что требуется (например, отправить пользователю).

    Плюс такой схемы в том, что можно запустить несколько потоков-обработчиков, если ресурсы компа позволяют. Но нужно будет продумать момент с их остановкой при завершении работы бота.
    Ответ написан
    Комментировать
  • Как скачать музыку?

    Vindicar
    @Vindicar
    RTFM!
    Что качает в питоне?

    А вообще, это сайт может проверять и отсеивать ботов, типа твоего скрипта.
    Как эту проверку обойти - зависит от того, как проверяют. В простых случаях хватит правильного набора заголовков HTTP (например, таких же как браузер посылает). В сложных там JS проверка, и придётся подключать эмулятор браузера типа selenium.
    Ответ написан
    Комментировать
  • Какие бывают типы исключений в python?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Подключить внешний скрипт Python?

    Vindicar
    @Vindicar
    RTFM!
    В js есть такое- загрузить внешний скрипт.
    А в Python-е есть что-то похожее?

    Сравнили попу с пальцем. То, что вы говорите - это разве что в браузерном JS встречается. В том же node.js так не делается, и очень хорошо что так.

    Вам нужно будет дописать к вашему скрипту приблуду, которая будет проверять наличие новой версии на сервере (а на каком? а что делать если он изменился?), скачивать её (а если интернет пропал? нужно продолжить загрузку) и распаковывать вместо старой (как насчёт резервной копии на случай отката обновелния?). А уж потом запускать распакованное (новое или старое).

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

    Однако есть и решения, которые часть этих задач берут на себя.
    Например, тот же pip умеет качать пакеты с гитхаба, так что клиент может выполнить что-то типа
    pip install --upgrade git+https://github.com/youracc/yourepo.git@branchname

    Но большая часть задач всё равно остаётся.
    Ответ написан
    Комментировать
  • Как получить КИРИЛИЧЕСКИЙ текст в python3 из PDF?

    Vindicar
    @Vindicar
    RTFM!
    Попробуй pdfplumber, я с ним работал без проблем.
    with pdfplumber.PDF(srcfile) as pdf:
    	pages = [page.extract_text() for page in pdf.pages]
    text = '\n'.join(pages)
    Ответ написан
    1 комментарий