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

    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 комментарий
  • FileNotFoundError: [Errno 2] No such file or directory: 'config.txt', как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Путь у вас относительный. Поэтому он считается относительно текущего рабочего каталога. Этот каталог может совпадать с каталогом, в котором лежит скрипт, а может не совпадать!
    Поэтому лучший способ - вычислять путь самому.
    sys.argv[0] всегда указывает на путь к файлу скрипта.
    Поэтому можно сделать либо так (с помощью os.path):
    os.path.join(os.path.dirname(sys.argv[0]), 'config.txt')

    либо так (с помощью pathlib)
    pathlib.Path(sys.argv[0]).parent / 'config.txt'
    Ответ написан
    Комментировать
  • Почему возникает данная ошибка при запуске любого скрипта питон?

    Vindicar
    @Vindicar
    RTFM!
    SyntaxError: unexpected character after line continuation character

    У тебя в строке где-то болтается символ \ вне строковой константы.
    Знак деления не перепутал, случаем?
    Ответ написан
    3 комментария
  • Определение количества квадратов с пересечением?

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

    Могут быть ложные срабатывания, если два перекрывающихся квадрата расположены идеально на одной вертикали/горизонтали. Тут нужно искать все срабатывания в этой области, и выбирать крайнее левое/правое или нижнее/верхнее.
    Ответ написан
    Комментировать
  • Помгите я сделал команду clear и мне нужно чтобы могли её использовать люди с определёным правом?

    Vindicar
    @Vindicar
    RTFM!
    Читай документацию на has_permissions.
    The permissions passed in must be exactly like the properties shown under discord.Permissions.

    Т.е. запрашиваемые разрешения должны писаться именно так, как перечислено по ссылке. Сравниваем:
    У тебя: manage_message
    По ссылке: manage_messages
    Ответ написан
    Комментировать
  • Как упаковать список в список в Python?

    Vindicar
    @Vindicar
    RTFM!
    1. формируешь список для данного элемента
    itemlist = [name_product, price, quantity, amount]
    2. закидываешь в этот список в общий
    information_products.append(itemlist)

    Удивлён, что это вызвало затрудения.
    Ответ написан
  • Как получить переменную из процесса threading в запросе flask?

    Vindicar
    @Vindicar
    RTFM!
    Потому что в ходе присваивания в name() ты создаешь локальную переменную a, которая перекрывает глобальную.
    Есть два решения:
    1. Простое: вставить в начало name() строку global a, чтобы работать с глобальной переменной
    2. Правильное: обернуть поток в класс, и работать с его экземплярной переменной вместо глобальной.

    К слову, при запуске потока добавь daemon=True, иначе твой поток не даст завершить работу сервера (он же while True).
    Ответ написан
    Комментировать
  • Как сделать два парсера?

    Vindicar
    @Vindicar
    RTFM!
    А переиспользовать один и тот же driver нельзя?
    Ответ написан
    Комментировать
  • Что не так с кодом?Не работает бот?

    Vindicar
    @Vindicar
    RTFM!
    1. Оформляй код как положено, кнопкой </>
    2. Тебе бот прямо говорит в чём дело:
    FileNotFoundError: [Errno 2] No such file or directory: 'static/welcome.webp'
    Ему в текущей рабочей директории нужна поддиректория static, и в ней файл welcome.webp
    Если файл есть, проверь, нет ли опечаток в имени.
    Также обрати внимание, что путь к файлу относительный, а потому зависит от текущей рабочей директории. Поменяй путь на абсолютный, или вычисляй этот путь относительно пути к исполняемому файлу бота.
    Ответ написан
    2 комментария
  • Как получить из трехмерного массива numpy строки совпадающие с указанной?

    Vindicar
    @Vindicar
    RTFM!
    (a == [2,0,2]).all(axis=2)
    a == [2,0,2] даст тебе трёхмерный массив булевых значений - результат поэлементного сравнения, при этом сравнение будет идти по последнему измерению.
    all(axis=2) сгруппирует этот массив по третьему измерению, при этом группа будет истинной, только если все значения в группе истинны. Т.е. только если в этой строке все значения совпали.
    >>> a = np.array([[[1, 0, 0], [2, 0, 1], [2, 0, 2]], [[0, 0, 0], [2, 0, 3], [0, 0, 0]]])
    >>> a == [2,0,2]
    array([[[False,  True, False],
            [ True,  True, False],
            [ True,  True,  True]],
    
           [[False,  True, False],
            [ True,  True, False],
            [False,  True, False]]])
    >>> (a == [2,0,2]).all(axis=2)
    array([[False, False,  True],
           [False, False, False]])
    Ответ написан
    1 комментарий
  • Как убрать пробел в строке print в Питон?

    Vindicar
    @Vindicar
    RTFM!
    А если нужно именно убрать вставку пробела между выводимыми значениями, то делаешь так:
    print('Привет,', name, '!', sep='')
    При этом sep может быть любой строкой, например:
    print('Привет,', name, '!', sep='::')
    выведет "Привет,::Вася::!"

    Аналогично есть параметр end, который указывает, что print() выведет после всех значений. По умолчанию это "\n" - переход на следующую строку, но можно указать end='', и тогда курсор останется на той же строке.
    Ответ написан
    Комментировать
  • Как правильно реализовать ввод данных?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, что именно ты пытаешься сделать?
    > firstnames = input("Введите ваше имя")
    Ты присваиваешь введённое пользователем значение локальной переменной метода input_info() (точнее, его параметру). Питон не предусматривает передачу параметров по ссылке, так что это присвоенное значение никогда выйдет за пределы метода, и будет потеряно, когда метод завершится.
    Далее, зачем while True + break? Чем не устроил простой return?
    Наконец, я бы не стал вносить такие методы в тело класса. Пусть основная программа разбирается с вводом/выводом так, как ей этого хочется, класс, хранящий данные, этим заниматься не обязан.
    class Umar():
        def __init__(self, firstname, lastname, patronymic, age, birthday, jobs, car):
            ... # тут код инициализации класса
    #эти функции можно сделать методами класса, 
    # но я бы рекомендовал оставить их вне класса,
    # так как способы ввода/вывода варьируются чаще, 
    # чем способы хранения данных.
    # красивый вывод содержимого класса
    def pretty_print_umar(u: Umar):
        print('Имя:', u.firstname)
        ... # ну и так далее
    # ввод данных с клавиатуры и создание по ним экземпляра класса
    def input_umar() -> Umar:
        firstname = input('Введите имя [Enter - отмена]:')
        if not firstname:
            return
        # и так далее для остальных полей, а затем
        return Umar(firstname, ...)
    Ответ написан
  • Почему не работают две одинаковые команды в разных группах?

    Vindicar
    @Vindicar
    RTFM!
    Дай угадаю, работает только первый или только второй метод, и если поменять их местами, начинает работать другой?
    Переименуй один из методов balance, ты же всё равно указываешь параметр name в декораторе.
    Ответ написан
    1 комментарий