• Не удается скопировать файл через 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!
    Ну если рассуждать логически.
    Если dM = 0, то xA должно быть равным xB.
    Чем больше dM, тем в большей степени xA отличается от xB.
    Если dM = -dN, то xA должен быть 0.
    Если рычаг не деформируется, и неподвижен, то напрашивается пропорция, исходя из равенства угловых моментов:
    dN * xA = (dN + dM) * xB
    Отсюда xA = xB * (dN + dM) / dN
    Ответ написан
    Комментировать
  • Как скачать музыку?

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

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

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как настроить черный список для телеграм бота?

    Vindicar
    @Vindicar
    RTFM!
    Вариант 1, простой: оформи проверку в виде функции вида user_id -> bool (true - заблокирован), вызывай в начале каждого обработчика команды. Если вернёт true, то просто return.
    Вариант 1.5: не знаю, как насчёт телеги, а вот бибилиотека для дискорда позволяет для обработчика команды указать функцию вида "можно ли вызывать этот обработчик?". Может, для библиотеки, которую ты используешь, есть что-то похожее?
    Вариант 2: оформи проверку как декоратор, и декорируй свои обработчики. Чуть короче чем вариант 1, если реакция на забаненного пользователя однотипная (например, игнор), то я бы предпочёл его.
    Ответ написан
  • Подключить внешний скрипт 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 комментарий
  • Можно ли сделать как-нибудь проще достижения в боте?

    Vindicar
    @Vindicar
    RTFM!
    Подумай, что требуется для описания достижения:
    1. Событие, которое вызвает его получение (сообщение, реакция, заход на канал, и т.д.)
    2. Программный код, который получает данные о событии и обновляет состояние достижения (например, увеличивает счётчик сообщений). Он может сообщить, получено ли пользователем какое-то достижение вместе с этим событием.
    3. База, где хранится информация о достижениях того или иного пользователя. В простейшем случае она будет иметь вид "пользователь-показатель-счётчик", т.е. например "вася - сообщения - 254". Код из п.2 будет читать этот показатель, увеличивать его, и если достигнуто желаемое значение, то выдавать сообщение. Для простоты можно хранить сообщения в отдельной таблице вида "показатель-порог-сообщение", тогда если показатель равен тому или иному порогу, бот должен послать соответствующее сообщение.

    Отсюда получается, что бот или его компонент должен содержать набор маленьких процедур, которые устанавливают связь между событием и показателем. А после обновления показателя может использоваться общая логика, которая проверит, не достигнут ли очередной порог.
    Ответ написан
  • 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)

    Удивлён, что это вызвало затрудения.
    Ответ написан