Ответы пользователя по тегу Python
  • Подключить внешний скрипт 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 комментарий
  • Как расположить несколько текстов в разных местах в label в tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Используй несколько label'ов или рисуй текст сам на canvas'е.
    Ответ написан
  • В чём ошибка кода?

    Vindicar
    @Vindicar
    RTFM!
    Прошу прощения, мой предыдущий ответ был неверен.
    Похоже, Дискорд больше не позволяет неофициальным клиентам присоединяться к серверам.
    См. issue #888 на github'е discord.py.
    Ответ написан
  • Как решить эту задачу?

    Vindicar
    @Vindicar
    RTFM!
    По-моему, нет нужды проверять, простой ли делитель. Смотри, мы проверяем делители от 2 до sqrt(N).
    Это значит, что если у числа есть составной делитель, то мы сначала наткнёмся на делители этого составного делителя. Тогда мы можем их устранить простым алгоритмом.
    Обрати внимание, делители храним не в списке, а в множестве (set), чтобы избежать двойных включений.
    1. Берём проверяемое число N, создаём пустой набор делителей. Принимаем последний множитель K = 2.
    2. Пока N > 1:
    3.    Цикл по i от K до корня из N
    4.        Если N делится на i, то i - делитель. Тогда
    5.            Принимаем K = i, делим N нацело на i, добавляем i в набор найденных делителей, прерываем цикл 3.
    6.    Если цикл 3. не был прерван, то текущее N - простое. Добавляем N в набор делителей, прерываем цикл 2.
    7. Возвращаем построенный набор делителей.

    Таким образом мы постепенно "устраняем" простые делители, от меньших к большим, пока число само не станет простым.
    А дальше просто, в цикле от 10001 до 50001 выполняем алгоритм выше.

    Также можно оптимизировать программу, заставив цикл 3 перебирать не все числа до корня из N, а заранее вычисленный список простых чисел до заданного максимального N. Но и без этого работает быстро.
    Ответ написан
    Комментировать
  • Как присоединиться к Discord серверу?

    Vindicar
    @Vindicar
    RTFM!
    Именно бота (т.е. программу, работающую с учёткой бота) - нельзя.
    А вот клиент-бота (т.е. программу, работающую из-под учётки клиента) - можно.
    Смотри метод Client.fetch_invite(). Но такие программы идут против ToS Discord, так что если поймают - могут и забанить.
    Ответ написан
    1 комментарий
  • Посчитать нечетные цифры числа методом рекурсии?

    Vindicar
    @Vindicar
    RTFM!
    #even и odd - счётчики чётных/нечётных цифр, при первом вызове должны быть 0
    def recursive_counter(number, even = 0, odd = 0):
      #проверяем, не пора ли остановить рекурсию:
      if number <= 0: #дошли до нуля - пора. Кроме того, с отриц. числами будут проблемы.
        return even, odd #возвращаем кортеж значений
      #отрезаем от числа последнюю цифру делением на 10.
      #divmod() - встроенная функция питона
      reduced_number, last_digit = divmod(number, 10)
      if last_digit % 2 == 0: #последняя цифра чётная
        #значит, на одну больше чётную цифру
        return recursive_counter(reduced_number, even+1, odd) #уходим в рекурсию
      else: #последняя цифра нечётная
        #значит, на одну больше нечётную цифру
        return recursive_counter(reduced_number, even, odd+1) #уходим в рекурсию
    
    N = 1234567890
    even, odd =  recursive_counter(N) #распаковываем кортеж, который вернула функция
    print(f'В числе {N} есть {even} чётных цифр и {odd} нечётных.')
    Ответ написан
    Комментировать
  • Python: Как вызвать асинхронную функцию из синхронной при действующем event loop?

    Vindicar
    @Vindicar
    RTFM!
    Заверни асинхронный коллбэк в синхронную обёртку (можно лямбду), которая вызывает asyncio.create_task() для целевой корутины, и передавай эту обёртку как коллбэк.
    Если же ты контролируешь func2, то ещё проще, вставь вызов create_task() туда.
    Вот если нужно дождаться результата выполнения, то будет сложнее - но можно засунуть обработку результата в асинхронную часть.
    Ответ написан
    3 комментария