• Примеры реальных (оперсорсных) проектов на FastAPI?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А в чем проблема на гитхабе поискать-то?
    https://github.com/search?q=fastapi+example&type=r...
    Ответ написан
    2 комментария
  • Как проверить запустилась ли трансляция FFMPEG через Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    UPD: Если вы не можете дождаться завершения дочернего процесса, то не обязательно блокировать программу для получения всего его выхлопа:
    import subprocess
    
    
    if __name__ == '__main__':
        cmd = 'py "(time.sleep(1) or print(i) for i in itertools.count())"'
        cmd = 'ping ya.ru'
        cmd = 'ffmpeg'
    
        with subprocess.Popen([cmd], stdout=subprocess.PIPE, text=True, shell=True) as p:
            for line in p.stdout:
                print(line.strip())

    Так вы можете получать выхлоп построчно или вовсе посимвольно:
    while 1:
        print(p.stdout.read(1), end='')

    Да, это по-прежнему блокирующий вызов, но вы можете читать строки в отдельном треде и по таймауту его закрывать, например.

    UPD2:
    Ну так что, автор, разобрался, или разжевывать надо решение?
    import subprocess
    import threading
    import logging
    import sys
    
    
    log = logging.getLogger(__name__)
    
    
    def check_process_output(process: subprocess.Popen, timeout: float, substring: str):
        def fetch_output():
            try:
                while process.poll() is None:
                    line = p.stdout.readline()
                    log.debug('FETCH: %s', line.strip())
                    data.append(line)
            except ValueError as e:
                pass
    
        data = []
        t = threading.Thread(target=fetch_output)
        t.start()
        log.debug(f'Wait %f s', timeout)
        t.join(timeout)
        result = substring in ''.join(data)
        log.debug('Output is%s contained substring %r', '' if result else ' NOT', substring)
        return result
    
    
    if __name__ == '__main__':
        logging.basicConfig(stream=sys.stderr, level='DEBUG')
        cmd = 'py "(time.sleep(1) or print(i) for i in itertools.count())"'
        cmd = 'ping ya.ru -c 8'
        # cmd = 'ffmpeg'
    
        with (subprocess.Popen([cmd], stdout=subprocess.PIPE, text=True, shell=True) as p):
            print('CHECK RESULT:', check_process_output(p, timeout=5, substring='ya.ru'))


    Можно сделать потомка от Popen, который будет вычитывать в треде свой stdout и на каждую строчку дёргать коллбэк, а также будет валиться по таймауту, если за какое-то время ни один коллбэк не вернул True.
    А можно просто добавить методы readline и read прямо в класс и с таймаутами в аргументах.
    Ответ написан
    4 комментария
  • Как реализовать радио-пищалку в эфир?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ridalit, 50 метров - это очень недалеко, на таком расстоянии лучше локализуется свет в сумерках или в темноте, да и звук в некоторых условиях легче локализовать, чем маломощную FM-пищалку.
    Можно поставить мигающий светодиод и мелкую пьезо-пищалку со встроенным генератором на мелкой батарейке и не надо городить никакую "охоту на лис".
    Вот тут есть схемка простейшего маячка на кварцевом резонаторе
    https://www.youtube.com/watch?v=KlVyjMnR_OI
    А резонаторы можно всякие брать на али: https://aliexpress.ru/popular/100mhz-crystal-oscil...
    Ответ написан
  • Как правильно прописать путь к файлу?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Пути могут быть абсолютные и относительные. В вашем случае указан относительный путь. Относительный путь, если его не присоединять к абсолютному, указывает на файл или каталог относительно текущего пути. В каждом процессе операционной системы есть внутреннее состояние того текущего пути. Если текущий путь н еменять, то он обычно наследуется от родительского процесса, или равен пути, по которому запустили скрипт.
    Указывайте путь либо абсолютно, либо относительно текущего пути в вашем приложении.
    Используйте pathlib - это сейчас самый современный и правильный способ работать с путями.
    Абсолютные пути начинаются со слеша (ну или с указания диска, если речь о винде), а относительные нет.
    Надо учить матчасть и азы прежде чем программировать ботов
    Ответ написан
    Комментировать
  • Как транслировать рабочий стол, выводя это в браузер VNC?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А в чем конкрено проблема? Проведите декомпозицию задачи. Разберитесь сперва как реализовать трансляцию видеопотока вообще, а потом как сформировать видеопоток, как его закодировать кодеком...
    У вас слишком общий вопрос. С такими надо на фриланс идти, а не сюда.
    Ответ написан
    Комментировать
  • Какие могут быть полезные или интересные применения для демо-сайта с ChatGPT?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    - Формировать интересный маршрут для прогулки по городу согласно вектору интересов пользователя. Нейросеть фильтрует POI из картографических сервисов, формирует план прогулки, формулирует интересные факты про локальные интересности. Фильтрация PoI, построение маршрута, создание описания маршрута, TTS с аудиогидом по маршруту.
    - вытаскивание из новостей в новостных лентах информации о топонимах, красивая визуализация происходящего в таймлайне с отображением на карте.
    - Короткая выжимка из типичных статей в Дзене, где о простых вещах запрягают такую телегу, что читать устанешь. Только факты и тезисы.
    - Попытка создать мыслительный процесс. Поток внешней информации обрабатывается отдельными запросами к нейросети для сжатия и выделения самого главного. Самое главное собирается в наборы и отдаётся нейросети для формирования выводов и личных размышлений на счет. предложенного. Результат обрабатывается нейросетью для выделения самого важного и сокращения объёма, а потом подмешивается на вход в следующей итерации.
    Получаем большой контекст, который будет инициализировать уже простые небольшие вопросы к нейросети. Получится эдакий "мыслящий мудрец" с некоторой даже имитацией памяти. Мыслить он будет не шибко быстро, но это и не сильно надо. Для интереса можно визуализировать "мысли", которые приходят в голову этому мудрецу. Эти мысли можно фильтровать отдельными запросами к нейросети для определения их соответствия критериям интересности.
    Таких сжатых контекстов можно держать сразу несколько, резюмировать их по отдельности, сливать результаты, снова резюмировать и отправлять снова на вход тому или иному контексту.
    Ответ написан
    2 комментария
  • Ошибка при запуске exe файла через Python RustClient.exe, как исправить?

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Как вариант - наборы от Алекса Гувера. https://kit.alexgyver.ru
    К тому же на его сайте есть много полезных материалов, а на канале есть, кажется, вдео с обзором готовых наборов и размышлениями по поводу того. что в него имеет смысл включать, а что нет.

    Такой набор удет нужен лишь для затравки, потом придёт понмание что именно нужно добавить и вы будете заказывать с алиэкспресса уже конкретные детали.
    Ответ написан
    Комментировать
  • Как удалить данные из БД по данным из переменной?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    cur.execute("DELETE FROM USER WHERE username=?", get_user)

    Зачем методом тыка пытаться программировать? Надо изучать SQL и БД
    Ответ написан
    1 комментарий
  • Как уменьшить ток светодиодной матрицы?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Если не жалко превратить энергию в тепло, то поставить последовательно ограничивающий резистор помощнее, но номинал подобрать по закону ома. 5 ватт. - это будет прилично так греться.

    Можно поискать резистор в цепи обратной связи блока питания и заменить его номинал, чтобы изменить выходной ток, но тут моих экстрасенсорных способностей не хватит, чтобы угадать как о у вас там устроен ваш БП
    Ответ написан
  • Существует ли Progress Bar для python, который легко считывать сторонними скриптами?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Не надо парсить прогресс-бар, то что вам нужно делается иначе.
    Во-первых, питоновский скрипт по атрибутам объекта sys.stdout может судить куда направлен выхлоп. Вариантов, по сути, два: файл или пайп, либо в терминал.
    Обычно если stdout является терминалом, то в него шлют по умолчанию красивый отформатированный выхлоп с цветами, псевдографикой, эмоджи и свистелками вроде симпатичных прогресс-баров с переписыванием текста поверх старых строк.
    Если это не TTY, то выдаём упрощенно оформленый вывод.
    Благодаря тому, что у нас символы и разные, можно делать в конце строки с прогрессбаром только возврат каретки без перевода строки, тогда следующая рисуется поверх предыдущей и создаёт эффект прогрессбара. Если этот же выхлоп ещё и идёт в пайп или файл, то там все состояния прогрессбара будут растянуты по отдельным строкам.

    Для облегчения работы с такими утилитами можно сделать им специальный ключ или параметр командной строки, который включит специальный режим выхлопа, предназначенный для простого парсинга результата. Например в таком особом режиме утилита может выдавать указанные динамические параметры в виде csv-строк с разделителями. Тогда GUI их сможет тривиально парсить прямо в потоке.

    Резюмирую. Используйте любую библиотеку для рисования прогрессбара. Большинство из них умеют делать нужный регресс при обнаружении пайпа на stdout. Но если она и не умеет, то вы можете это реализовать самостоятельно, просто добавив ключ и\или проверку на TTY.
    Ответ написан
  • Почему бот в телеграмме не реагирует на код?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Если это весь код вашего бота, то ничего удивительного. Вы только сконфигурировали его, но не добавили вызов метода, который будет "слушать" порт и запускать ваш обработчик.
    Ещё вы допустили только что слив секретного ключа вашего бот. Так делать нельзя. Нужно хранить ключ в отдельном секретном файле и импортировать или загружать его, не допускать добавления секретного файла в репозиторий.
    Ещё можно было бы сравнивать текст без учета регистра, чтобы "привет" и "Привет" были одной и той же командой.
    Вам также не помешает логирование в коде, чтобы понимать до куда доходит обработчик и что происходит в коде, какие сообщения приходят на самом деле, и всё такое.
    Ответ написан
    Комментировать
  • Есть ли нагрузка на генератор при выдаче электричества в общественную сеть (микрогенерация)?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Если вы отдаёте мощность - не важно куда (в сеть или на обогреватель), то эту мощность нужно вырабатывать, а значит нагрузка будет, и будет она пропорциональна отдаваемой мощности.
    Сколько мощности будет отдаваться в сеть будет решать ваш контроллер согласно своих характеристик и настроек. Соответствующую нагрузку он и будет перекладывать на плечи вашего генератора.
    Чтобы отдать энергию в сеть, вам нужен инвертор, который синхронизируется своим синусом с сетью и будет передавать в сеть некоторую мощность. В зависимости от алгоритма работы этого инвертора мощность, отнимаемая от генератора, может подниматься скачком, или нарастать плавно - это зависит только от дороговизны вашего инвертора и контроллера.
    Ответ написан
    3 комментария
  • Питон ставит правила(сарказм) по f.read, что делать, не работает как должно. Есть возможности?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    with open("convert_der/after.txt", "r") as r:
            count = r.read().count('|')
            print(f'Суммарно {count}')
            read = r.read()

    Смотрите что тут происходит:
    - открывается файл на чтение
    - вычитывается всё содержимое файла и в содержимом подсчитывается число "|", при этом считанное содержимое никуда не сохраняется в памяти.
    - повторный read уже ничего не прочитает. Просто пустая строка будет.

    В файле есть виртуальный курсор, когда файл открыт на чтение, курсор стоит в его начале. Можно читать указывая количество символов для чтения, или читать построчно, тогда курсор сдвигается на указанное число символов или на строку, а дальнейшие чтения будут уже с нового места. Если вы вычитали весь файл, а именно это происходит при read() без параметров, то курсор уже в конце, и оттуда можно прочесть только пустоту.
    Ответ написан
    Комментировать
  • Как сделать эффективный алгоритм перебора всех возможных значений?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Опишите функцию получения следующего значения после предыдущего (функция инкремента строки).
    Для этого нужно просто заменить последний разряд на следующее его значение, а если строка пустая, то вернуть "а".
    Если произошло переполнение, то выполняем функцию инкремента к строке без последнего символа, и результат конкатенируем с "а".

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

    У вас, кстати, еще ошибка:
    То есть в диапазон должно входить 3^2=9 значений,

    3^2+3^1
    Ответ написан
  • Правильно ли решил задачу по топпингу в пиццу. 7.1 Эрик Мэтиз Python?

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

    Учиться, учиться и ещё раз учиться.
    Ответ написан
  • Как передать json файл из серверного файла app.js ( node.js ) в клиентский function.js, для обработки и вывода в html?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    fetch('data.json') выполняется на компьютере пользователя внутри его браузера, а файл вы сохранили в файловой системе сервера, в каталоге где запущено ваше приложение.
    fetch загружает контент по http с удалённого сервера, по умолчанию берется тот же хост, с которого получена страница со скриптом. Но этот сервер не отдаёт по http по пути имени этого файла этот файл. Для этого нужно либо создать соответствующий хендлер на сервере и настроить роутинг, либо положить файл в файловой системе так, чтобы его раздавал веб-сервер, который вы используете в качестве прокси, например nginx. Тогда вы сможете скачать клиентом этот файл.

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

    Это тривиальная задача, которую изучают все в самом начале изучения веб-разработки. Если вы хотите дойти до всего самостоятельно и изобрести пару квадратоколёсных велосипедов по пути - ваше право. Но трудно найти индивидуального репетитора, который будет вас учить таким азам, которые можно прочесть в книжке.
    Ответ написан
    Комментировать
  • Почему не парсятся ссылки на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Смотрите внимательно как устроен ваш парсер. Вам уже намекнули в соседнем ответе.
    Вы парсите статью так, будто бы её текст весь в одной строке (во второй по счету). А ссылки вы ищете в третьей строке, но из-за того, что статья многострочная там их нет.

    Разбивайте задачу на маленькие подзадачи и делайте их отдельно, на каждом шагу убеждаясь, что всё как надо. Для этого можно делать отладочный выхлоп в промежуточных состояниях.

    ВОт вы почему-то свято уверены, что lines[2][8:] - это перечень ссылок через запятую. Может быть даже в одном из примеров в какой-то момент когда-то так оно и было, но с тех пор вы уже поменяли, скорее всего, код или входной формат, но не учли это.
    Делайте больше отладочного вывода. Лучше не принтами, а с использованием модуля logging, тогда отладочный выхлоп можно включать и отключать при необходимости не трогая код.
    Каждый раз, когда вы меняете код, не важно для исправления старых ошибок, или для добавления новой функциональности, вы неизбежно вносите новые ошибки.
    Чтобы это контролировать пишут юнит-тесты. Но вам, похоже, еще рановато.
    Ещё, особенно в небольших скриптах, полезно убеждаться, что всё идёт как надо в промежуточных этапах. Для этого в питоне есть ключевое слово assert.
    Оно позволяет указать обязательное условие, которое должно соблюдаться в этом месте выполнения программы, и текст ошибки, с которой упадёт программа в этом месте, если условие не соблюдается.
    Конкретно здесь, можно было бы убедиться с помощью assert, что в третьей строке вы отрезали 8 символов и эти символы соответствуют префиксу "Images: ".
    Падение программы на этом месте даст вам понять, что вы где-то ошиблись и что-то пошло не так, как вы ожидали. Эти ассерты также помогут вам сразу обнаруживать изменение входного формата данных, за который, возможно, отвечает не ваш код.
    Ответ написан
    Комментировать
  • Имеются ли какие алгоритмы оптимизации точек на карте?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А что тут вообще сложного? Просто находите точки, угол между ребрами в которых ближе всего к 180 градусов. Их можно удалять. Угол между векторами считается просто, легко погуглить.
    Еще можно отправить ключевые точки в Построитель маршрута типа osrm и он выдаст красивую геометрию маршрута по дорогам.
    Ответ написан
    Комментировать
  • Aiogram как сделать mute в группе телеграм?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ну так прочитайте свой код.
    Вот спецификация метода: https://docs.aiogram.dev/en/dev-3.x/api/methods/ge...
    Там указано какого типа юзерайди ожидается, а вы туда юзернейм суёте строкой.

    Вы можете сохранять ботом словарь имен и идентификаторов всех юзеров, которые пишут в чате, заглядывать в этот словарь и доставать оттуда user_id.
    Можете команду мьюта отсылать ответом на сообщение пользователя, которого хотите замьютить. Тогда достать его идентификатор можно так: message.reply_to_message.from_user.id
    Ответ написан
    1 комментарий