Задать вопрос
Ответы пользователя по тегу Python
  • Почему возникает ошибка error: [Errno 24] Too many open files при requests.get?

    Vindicar
    @Vindicar
    RTFM!
    Вообще ошибка редкая.
    Превышен лимит на число открытых файлов для процесса - это весьма вероятно число открытых сокетов тоже (сокет ~ файл во многих осях).
    Убедись, что закрываешь соединение корректно, и убавь количество запросов в секунду.
    Ответ написан
    Комментировать
  • Как импортировать пакет/модуль через другой файл?

    Vindicar
    @Vindicar
    RTFM!
    Так, как вы это пытаетесь сделать - никак. Просто невозможно.
    Максимум, вы можете схитрить: пусть load() возвращает объект(ы) модуля(ей), которые она импортировала, а код, который вызывает load(), сам присваивает этим объектам имена.
    #somemodule.py
    def load():
      import mymodule1
      import mymodule2
      return mymodule1, mymodule2

    А потом
    import somemodule
    mymodule1, mymodule2 = somemodule.load()


    Но вообще вам дело говорят, такие конструкции - повод задуматься о структуре приложения.
    Раз уж основной модуль должен использовать какие-то субмодули, может, пусть он их и импортирует сам?
    Тем более что повторный импорт в питоне очень быстр, модули при импорте кэшируются.
    Ответ написан
    4 комментария
  • Что требуется в задаче Python?

    Vindicar
    @Vindicar
    RTFM!
    В первой задаче всё достаточно просто.
    1) чтобы понять, насколько мы увеличим сумму чисел, достаточно посчитать сумму до и после преобразования. Так что задач сводится к "максимизировать сумму чисел, меняя в них цифры"
    2) Чтобы максимизировать сумму, надо максимизировать слагаемые. Так что нужно как можно сильнее увеличить числа, заменив одну цифру за раз.
    3) Как увеличить число как можно сильнее? Нужно заменить старший разряд в числе на девятку, это даст наибольший эффект.
    4) Тонкость раз: если старший разряд уже девятка, нам нужен следующий разряд, и т.д. пока не найдём НЕ девятку. Если число из одних девяток, его игнорируем.
    5) Тонкость два: если у нас есть числа 12 и 123, то больший эффект будет достигнут увеличением второго, т.к. у него старший разряд больше.
    6) Тонкость три: если у нас есть числа 123 и 456, то больший эффект будет достигнут увеличением первого, т.к. у него старший разряд имеет меньшее значение.

    Отсюда логика решения: для каждого числа ищем старший разряд, не равный 9. Фиксируем сведения о числе, номере разряда (единицы, десятки, сотни и т.п.), и цифре в разряде.
    В списке найденных "кандидатов на замену" убираем все варианты, где номер разряда меньше максимального в списке (т.е. если у кого-то можно заменить сотню, то десятки и единицы уже не рассматриваем). Этот шаг можно совместить с генерацией списка.
    Из оставшихся кандидатов ищем того, у кого цифра в разряде наименьшая. Эту цифру в этом числе и заменяем на девятку.
    Прирост числа, а значит и прирост общей суммы, будет равен (9 - старая цифра) * вес разряда. Например, заменили в сотнях 2 на 9, получим прирост (9 - 2) * 100 = 700.

    Процесс повторяем k раз, прирост накапливаем.
    Ответ написан
    Комментировать
  • Как создать интерфейс к уже существующему скрипту на Python?

    Vindicar
    @Vindicar
    RTFM!
    Вынесите основной функционал вашего скрипта в подпрограммы, типа
    def generate_emails() -> List[str]:
        'Генерирует список адресов почты.'
        ...
    
    def check_emails(emails: List[str]) -> List[bool]:
        'Получает список адресов почты возвращает список ответов "успешно или нет".'
        ...


    Потом пишете новый скрипт, в нём импортируете старый и используете эти функции.
    Чтобы создать GUI, посмотрите в сторону Tkinter, он в питоне есть из коробки и для простых задач подойдёт.
    Ответ написан
    Комментировать
  • Можно ли выйти сразу из всех функций?

    Vindicar
    @Vindicar
    RTFM!
    Вариант 1: Пусть функции возвращают значение типа bool, если оно истинное - то вызвавшая функция тоже должна прерваться.

    Вариант 2: выбросить исключение, поймать его там, где нужно остановить цепочку выходов. Имеет смысл описать своё исключение для такого, это несложно.

    Вариант 3:
    import sys
    sys.exit()
    Завершает работу скрипта. По факту, то же что и вариант 2, так как sys.exit() выбрасывает неотлавливаемое исключение.
    Ответ написан
    Комментировать
  • Как получить значение из памяти по его адресу?

    Vindicar
    @Vindicar
    RTFM!
    Если на винде, то нужно использовать winapi, ReadProcessMemory(). При этом нужны права доступа к процессу. Простейший способ их иметь - запустить этот процесс самим как дочерний.

    Вообще питон для таких вещей не слишком подходит, но с помощью модуля win32 там можно обращаться к winapi функциям.

    Имейте ввиду, что уже давно программы рандомизируют адреса памяти при запуске. Не факт, что этот адрес будет таким же каждый раз. Тогда придётся и поиск реализовывать самому.
    Ответ написан
  • Как залить площадь одним цветом OpenCv?

    Vindicar
    @Vindicar
    RTFM!
    В зависимости от того, как рисуешь контур:
    • либо в cv2.drawContours() указываешь параметр thickness=-1 (залить фигуру, работает на многих рисовальных функциях)
    • либо используешь cv2.fillPoly() вместо cv2.polylines()

    Читай документацию, она полезная.
    Ответ написан
    1 комментарий
  • Как убрать лишний "мусор" OpenCv python?

    Vindicar
    @Vindicar
    RTFM!
    Выше уже написали про морфологическое открытие (несколько раундов эрозии, потом несколько раундов диляции). Это удалит "тонкие" элементы, в т.ч. пятна, но не сильно исказит форму "толстых".
    А если тебе нужно только одно белое пятно, то используй поиск связных компонентов (непрерывных белых пятен), и фильтруй найденные компоненты по площади и/или пропорциям. Найдя нужный, обрабатывай его отдельно.
    Ответ написан
    Комментировать
  • Как сделать, чтобы роль по реакции на сообщения, ставилась игроку, который написал запрос, а не админу, который поставил реакцию?

    Vindicar
    @Vindicar
    RTFM!
    Подсказка - нужно изменить эту строку:
    member = payload.member
    Для on_raw_reaction_add() поле payload.member - это тот, кто поставил реакцию.
    Если почитать доки, то у payload есть несколько полей, и среди них message_id, которое содержит id сообщения, на которое была поставлена реакция.
    После этого нужно получить канал, где было сообщение (если что, в payload есть guild_id и channel_id), и на этом канале вызвать fetch_message(). Получите объект класса Message, у которого уже будет свойство author.
    Ответ написан
    Комментировать
  • Как узнать "размер" контура OpenCv?

    Vindicar
    @Vindicar
    RTFM!
    Нужно определиться, что считать под размером.
    Длину контура можно найти через cv2.arcLength(), но она может быть большая для неровных контуров (зазубренные края) и для вытянутых контуров.
    Площадь контура - через cv2.contourArea().
    Видимые размеры можно оценить через cv2.boxPoints().
    Ответ написан
    2 комментария
  • Как передать переменную в экранированную js строку?

    Vindicar
    @Vindicar
    RTFM!
    Можно использовать f-строки (сравнительно новая штука).
    f'''
    foo = {value};
    alert(foo);
    '''

    Если нужна поддержка старых версий питона, то используй форматирование строк
    '''
    foo = {value};
    alert(foo);
    '''.format(value=value)
    Ответ написан
    Комментировать
  • Проблема с cogs, переделал код и не могу понять в чём проблема?

    Vindicar
    @Vindicar
    RTFM!
    Из документации по purge():
    You must have the manage_messages permission to delete messages even if they are your own (unless you are a user account). The read_message_history permission is also needed to retrieve message history.

    У бота точно есть разрешения на это?

    Далее, purge(limit = 1) - что вообще пытаетесь сделать? Удалить сообщение с командой? purge() вообще-то для массовых удалений по критерию.
    Не лучше ли будет использовать ctx.message.delete()?
    Ответ написан
    1 комментарий
  • Как исправить ошибку discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, фигачить cursor.execute() прямо в f-строку - это очень, очень плохая идея. За такое бьют по пальцам.
    Во-вторых, not subscriptable означает, что ты пытаешься обратиться по индексу (типа x[0]) в то время как объект (x) - это None.
    90% шанс что это вызов .fetchone()[0] - запрос к базе не находит нужную строку, тогда fetchone() возвращает None, а дальше попытка получить индекс от None генерирует исключение.

    Никогда, НИКОГДА не пиши в f-строках выражение сложнее чем 2*2. Вынеси промежуточный результат в переменную, проверь её значение на корректность, затем уже используй.
    Ответ написан
    Комментировать
  • Как правильно сделать цикл?

    Vindicar
    @Vindicar
    RTFM!
    Учим циклы. Не уверен, что делаю именно то, что тебе нужно, но надеюсь, идея будет понятна.
    sheet2["B7"] = sheet['C' + str(i)].value
    sheet2["D7"] = sheet['E' + str(i)].value
    sheet2["E7"] = sheet['N' + str(i)].value
    sheet2["F7"] = sheet['F' + str(i)].value
    sheet2["G7"] = sheet['J' + str(i)].value

    легким движением руки превращается в...
    cols1 = ('B', 'D', 'E', 'F', 'G')
    cols2 = ('C', 'E', 'N', 'F', 'J')
    row1 = 7 # какие строки тебе нужны, я так и не понял, ну да сам разберёшься
    row2 = row1 + 18 # то же самое тут
    #делаем цикл по парам - элемент из cols1 и элемент из cols2
    for col1, col2 in zip( cols1, cols2): 
        # запись вида f'{x}' подставит в строку значение переменной x
        sheet2[f'{col1}{row1}'] = sheet[f'{col2}{row2}'].value
    Ответ написан
  • Как рассчитать общую стоимость?

    Vindicar
    @Vindicar
    RTFM!
    У тебя есть два возможных случая.
    а. Начальный рейтинг и целевой рейтинг в одном диапазоне. Рассчитываешь стоимость по цене этого диапазона.
    б. Начальный рейтинг и целевой рейтинг в разных диапазонах.
    Тогда общая стоимость будет складываться из трёх значений.
    1) Стоимость выхода из начального диапазона: (верхняя граница - начальный рейтинг) * цена диапазона
    2) Стоимость прохода через все промежуточные диапазоны: Сумма ((верхняя - нижняя) * цена диапазона). Может быть нулевой, если целевой рейтинг в соседнем диапазоне.
    3) Стоимость внутри целевого диапазона: (целевой рейтинг - нижняя) * цена диапазона

    Возможно, разности придётся округлить вверх до минимального количества покупаемого за раз рейтинга.

    А вообще ты уверен, что в рамках одной транзакции цена за рейтинг разная? Может, она зависит только от стартового рейтинга? Тогда буст большими объемами с малых рейтингов будет выгоднее.
    Ответ написан
    Комментировать
  • Где тут ошибка?

    Vindicar
    @Vindicar
    RTFM!
    Не хочется ругаться матом, поэтому напишу на питоне
    class MyCog (commands.Cog):
        def __init__(self, bot):
            self.enter_times = {}
        @commands.Cog.listener()
        async def on_voice_state_update(self, member, before, after):
            if before.channel is None and after.channel is not None:
                #событие входа в чат - кладем время входа в словарь
                self.enter_times[member.id] = time.time() #число секунд от начала эпохи Unix
            elif before.channel is not None and after.channel is None:
                #событие выхода из чата - вытаскиваем время входа и удаляем его из словаря
                enter = self.enter_times.pop(member.id, None) 
                if enter is not None: # мало ли, бота перезапустили пока кто-то сидел в войсчате
                    delta = time.time() - enter # число секунд с момента входа
                    print(f'member {member.id}: {delta:.1f} seconds')
    Ответ написан
    Комментировать
  • Как можно быстро произвести вычисления?

    Vindicar
    @Vindicar
    RTFM!
    1. быстрое, тупое и неэффективное решение
    Посмотри в сторону multiprocessing, запусти дочерних процессов по числу ядер.
    Обычный threading может не сработать из-за проблемы GIL (Global Interpreter Lock).

    2. умное но сложное решение.
    Imagehash, насколько я понимаю, вычисляет разность хэшей как расстояние Хэмминга.
    Ответ на вот этот вопрос на stackoverflow даёт ряд ссылок на алгоритмы, занимающиеся похожей проблемой. Но придётся пошевелить мозгами, чтобы понять какой из них применим, и как его применить. Тут я уже не помощник.
    Ответ написан
    Комментировать
  • AttributeError: 'str' object has no attribute 'sleep' ошибка. Как решить?

    Vindicar
    @Vindicar
    RTFM!
    Чтобы решить, надо думать что делаете.

    import time - импортируете модуль time в переменную time
    time = input("Сейчас день или ночь?: ") - выкидываете старое значение переменной time и заменяете его строкой. Прощай, модуль.
    time.sleep(0.5) - пытаетесь обратиться в функции sleep() модуля в переменной time, но его там уже нет, там теперь строка

    Тут дело не в питоне, а в элементарной логике.
    Ответ написан
    Комментировать
  • Здравствуйте, есть файл с ИНН сотрудников за 1-е полугодие и за 2-е, как вывести ИНН сотрудника с наибольшей зарплатой за первое полугодие?

    Vindicar
    @Vindicar
    RTFM!
    salaries = [] # список будет содержать пары значений ИНН-зарплата
    # открываем файл так, чтобы он потом был закрыт, что бы ни случилось
    with open('salary.txt', 'rt', encoding='utf-8') as src:
        for line in src: # перебираем строки в файле
            try: # на случай, если строка неправильная
                row = line.split(',') #делим строку на части
                INN, salary = row[0], row[1] 
                # ИНН оставим строкой
                salary = int(salary) # зарплата - целое число?
                # если всё прошло как надо, добавляем пару в список
                # обратите внимание на двойные скобки
                salaries.append( (INN, salary) ) 
            except: # если была ошибка, ругаемся на строку
                print('Некорректная строка пропущена:', repr(line))
                # pass # ну или просто пишем pass чтобы ничего не делать
    # теперь все данные у нас в списке
    # могли бы и не делать список, а сканировать сразу файл,
    # если нужен только максимум, а файл большой
    # находим максимум стандартной функцией
    # функция вернёт элемент списка, т.е. пару значение ИНН-зарплата
    # key показывает, по какому критерию сравнивать элементы списка
    # в нашем случае элемент №1 (с нуля), т.е. зарплата
    max_INN, max_salary = max(salaries, key = (lambda row: row[1]))
    print(max_INN)
    Ответ написан
    Комментировать
  • AttributeError: 'int' object has no attribute 'price' как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Команда
    A=[0, 0, '']*401
    даст список вида [0, 0, '', 0, 0, '', .........]
    Т.е. число элементов списке будет 401 * 3.
    Зачем вообще выделять список заранее?
    Сделай его пустым A = [] и делай A.append(....) для каждой прочитанной строки.
    Ответ написан