Ответы пользователя по тегу Python
  • Как связать переменные i и result в функции range?

    Vindicar
    @Vindicar
    RTFM!
    Вместо перезаписи result собирай отдельные строки в список, а потом используй str.join() чтобы объединить список в одну длинную строку.
    Ответ написан
    Комментировать
  • Ошибка в aiogram :'cannot import name 'executor' from 'aiogram'', почему?

    Vindicar
    @Vindicar
    RTFM!
    Под какую версию aiogram код, и какая версия установлена у тебя? aiogram изменил API при переходе с версии 2 на версию 3.
    Ответ написан
    Комментировать
  • Как создать выпадающий список с данными из postgres на python?

    Vindicar
    @Vindicar
    RTFM!
    select "Route_num" from "Route TB"
    Во-первых, ты кавычки не перепутал? В SQL вроде имена столбцов и таблиц экранируются `бэктиками`, а не "кавычками".
    Во-вторых, ты просишь выбрать одно значение на каждой строке. Но в то же время обращаешься к item[1], т.е. ко второму элементу строки. Которого быть не может, так как ты выбираешь только один.
    Ответ написан
    6 комментариев
  • Как в машинном состоянии принимать несколько файлов?

    Vindicar
    @Vindicar
    RTFM!
    await FileSendingGroup.next() выполняет переход на следующее состояние.
    Если ты можешь понять, когда пользователь послал последний файл, выполняй этот переход только тогда.
    Ответ написан
  • Как в питоне вводить элементы массива одной строчкой через пробел?

    Vindicar
    @Vindicar
    RTFM!
    Вводишь строку и делаешь на ней str.split() с желаемым разделителем.
    Получаешь список кусочков строки, каждый преобразуешь как надо.
    Ответ написан
    1 комментарий
  • Как установить aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Какая версия питона? Вроде аиограм даже 3.11 не умеет ещё.
    Ответ написан
  • Есть ли какие то варианты вызвать деструктор принудительно кроме обязательного использования контекстного менеджера?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, ты вот так сходу это не реализуешь, потому что помимо вложенных словарей есть списки и другие коллекции, а также есть классы. Ты, конечно, можешь схитрить - сделать класс-прокси, который сигнализирует об изменениях при __setattr__() и __setitem()__, а также реализует вызовы __getattr__() и __getitem__() так, чтобы возвращать такой же прокси для целевого объекта.
    Условно:
    l = [1]
    d = {'a': l}
    pd = MyProxy(d)
    lst = pd['a']  # на самом деле lst это MyProxy(l, owner=pd)
    lst[0] = 2  # прокси-список реагирует на присваивание и оповещает владлеьца - прокси-словарь

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

    Я бы сказал, вообще не очень хорошая идея реализовывать персистентность вот так.
    Вариант А: делай снапшоты в фиксированные моменты времени. Если сохранение снапшота слишком долгое, сделай клон через deepcopy и сохраняй клон, пока оригинал изменяется дальше.
    Вариант Б: явно сохраняй изменения, которые должны быть персистентными. Каждое в отдельности.
    Вариант В: Используй память, отображаемую на диск. Тогда ОС сама будет периодически сбрасывать изменившиеся страницы памяти на диск (хотя есть метод flush()).
    Но в этом случае может потребоваться изменить структуру данных, избавившись по максимуму от сложных объектов типа словарей и заменив их на простые массивы байт. Если нужны структуры, то их придётся распаковывать с помощью struct. Т.е. опять приходим к тому, что структура не должна быть сложной.
    Ответ написан
  • Является ли python-shell безопасным решением для запуска untrusted-кода на Node.js сервере?

    Vindicar
    @Vindicar
    RTFM!
    Не думаю, он создаёт дочерний процесс от ноды, но в доках не написано, что этому процессу задаются особые права - значит, права будут как у ноды.

    Я бы сделал минимум три уровня защиты:
    1. Полученный от пользователя скрипт выполняется не напрямую, а в скрипте-обёртке. Обёртка подписывается на события аудита Питона, и мониторит событие импорта. При попытке импорта модуля не из белого списка сигнализируем родительскому процессу и вызываем заранее сохранённую os._exit(), чтобы немедленно прибить интерпретатор. Также на обёртку можно возложить собственно прогон тестов.
    2. Скрипт-обёртка должен выполняться от nobody:nobody с правами только на временную директорию, в которой лежит сам скрипт и его виртуальное окружение. Директория должна пересоздаваться заново при каждом запуске скрипта. Может иметь смысл оформить выполнение обёртки внутри chroot.
    3. Выполнение должно происходить внутри контейнера, который должен перезапускаться время от времени (не обязательно при каждом запуске скрипта, можно раз в сутки или около того). Передача скрипта внутрь контейнер - через сетевой сервис, хотя можно и через примонтированную директорию. Внутри контейнера сервис сам создаёт временную директорию с окружением, переносит скрипт в эту директорию (с переименованием в заранее известное имя - user_script.py или подобное) и только тогда запускает обёртку.

    В этом случае атакующему нужно будет сначала обойти аудит импортов, потом сделать эскалацию привилегий, потом выбраться из-под chroot. И даже если он закрепится в контейнере, контейнер периодически перезапускается, так что малварь будет снесена.
    Ответ написан
    3 комментария
  • Как сравнить пустое значение из БД?

    Vindicar
    @Vindicar
    RTFM!
    Учи матчасть. Всё делается одним запросом.
    SELECT referal_id, COUNT(*) FROM users GROUP BY referal_id

    Группировка сделает так, что для каждого referal_id будет выведена одна строка, а групповые функции посчитают некий итог для каждой группы строк с одним и тем же значением referal_id. В частности, COUNT() посчитает сколько строк в группе.
    Ответ написан
    Комментировать
  • Как сделать такой функционал кнопок Telebot python?

    Vindicar
    @Vindicar
    RTFM!
    Отредактируй сообщение, при редактировании отправь новую разметку для кнопок?
    Ответ написан
    Комментировать
  • Почему не корректно работает код?

    Vindicar
    @Vindicar
    RTFM!
    for i in range(len(zones)):
                        pin = i + 2  # Номер пина соответствует номеру зоны + 1
                        if i+1 in in_zones:
                            # Если объект находится в зоне, зажигаем светодиод
                            board.digital[pin].write(1)
                        else:
                            pin = i + 2
                            # Если объект не находится в зоне, гасим светодиод  <--- НАПРАСНО
                            board.digital[pin].write(0)

    Косяк вот тут. Если текущий объект не находится в зоне, это не значит что никакой другой, ранее найденный объект не находится в этой зоне.
    Сделай массив bool по числу зон, в начале итерации выставь все элементы в false. По ходу итерации выставляй элемент в true если в зоне найден человек.
    В конце итерации выставляй светодиоды по элементам массива.
    Ответ написан
    1 комментарий
  • Почему не заканчивается цикл while true?

    Vindicar
    @Vindicar
    RTFM!
    В твоём коде break прервёт цикл for command in commands.
    Выполнение внешних двух циклов продолжится.
    Ответ написан
    Комментировать
  • Можно ли задать условия для работы opencv?

    Vindicar
    @Vindicar
    RTFM!
    Ну и в чём вопрос? У тебя в коде уже есть проверка на силу совпадения (сравнение найденного максимума силы с некоторым порогом). Если тебе нужно выполнять другое действие, то добавь ветку else туда.
    Если тебе нужно просто крутить цикл, и выполнять действие, когда изображение найдётся, можешь завернуть в цикл while тело red() или даже просто вызывать её саму в цикле. Условие завершения цикла обдумай сам, я без понятия что ты хочешь сделать.
    Ответ написан
    Комментировать
  • Как отправить аудиофайл в боте телеграм Python?

    Vindicar
    @Vindicar
    RTFM!
    Сначала проверь путь. Ты указываешь относительный путь к файлу, а он рассчитывается исходя из текущей рабочей директории. Которая может совпадать или не совпадать с директорией где лежит скрипт, это зависит от способа запуска скрипта.

    Так что лучше ориентируйся так. sys.argv[0] содержит путь к скрипту, а модуль pathlib позволяет манипулировать путями.
    import sys
    from pathlib import Path
    
    BASE_DIR = Path(sys.argv[0]).parent.resolve()  # каталог скрипта
    AUDIO = BASE_DIR / 'audio.mp3'  # файл в каталоге скрипта
    #......
    async def send_songs(message):
        await message.answer("Hello!")
        await message.answer("World!")
        audio = AUDIO.open('rb')
        await bot.send_audio(message.chat.id, audio)
    Ответ написан
  • Как "помечать" объекты, красиво ли добавлять свои атрибуты в чужие объекты?

    Vindicar
    @Vindicar
    RTFM!
    Я бы заставил verify_chain() возвращать список объектов-сертификатов, не прошедших проверку (ну и переименовал бы её соответственно, типа find_broken_certs()). Так как это ссылки на существующие объекты, объём памяти будет затрачен минимальный. Проверить, есть ли в списке хоть один сертификат - тривиально. А если хочется подробностей - вот он список, читай.
    Ответ написан
    Комментировать
  • Как в строке найти только нужный текст?

    Vindicar
    @Vindicar
    RTFM!
    Проверять равенство строк (==), а не вхождение подстроки в строку (in).
    Ответ написан
    Комментировать
  • Ошибка в sqlite3 telebot?

    Vindicar
    @Vindicar
    RTFM!
    Выучить питон ДО того, как бросаться писать ботов, а не после.
    def summa (message: int) -> int:
        msg = bot.send_message(message.chat.id, 'Введите сумму перевода:')
        bot.register_next_step_handler(msg, perevod)


    Ты заявляешь, что функция возвращает int, и используешь её, как будто она возвращает int, но она ничего не возвращает - а раз так, она возвращает None.

    Ну и да, читай примеры из документации, как правильно использовать register_next_step_handler().

    sqlite тут вообще не при делах, но я замечу: не используй f-строки для формирования запросов. Вот, INSERT ты вроде правильно делаешь, так в чём проблема везде делать так же?
    Ответ написан
    Комментировать
  • Disnake не находит команду. как решить?

    Vindicar
    @Vindicar
    RTFM!
    На полноценную глобальную регистрацию команды бота в дискорде уходит время. Кто-то называл срок около часа что ли, я сам не пробовал.
    В доках написано, как тестировать в рамках одного сервера. Попробуй сначала так.
    from disnake.ext import commands
    
    command_sync_flags = commands.CommandSyncFlags.default()
    command_sync_flags.sync_commands_debug = True  # чтобы бот писал в лог ход регистрации
    
    bot = commands.Bot(
        command_prefix='!',
        test_guilds=[123456789], # локальная регистрация для одного сервера
        command_sync_flags=command_sync_flags,
    )
    Ответ написан
  • С чем может быть связана ошибка "asyncio.exceptions.CancelledError"?

    Vindicar
    @Vindicar
    RTFM!
    Открой доки и почитай. CancelledError выбрасывается в корутине, когда она завёрнута в таск через create_task() и на этом таске вызван метод cancel(). Это позволяет прервать выполнение корутины через выбрасывание специального исключения. Исключение не наследуется от Exception, поэтому обычный try-except его не ловит, если только специально не указать try ... except CancelledError. Так сделано, потому что при выходе через всплывание исключения будут отрабатывать все нормальные питоновские механизмы: блоки finally, блоки with и так далее.
    Я полагаю, команда на остановку бота делает cancel() на его главной корутине, скорее всего запущенной внутри start_polling(). Это исключение всплывает в твой main(). Но поскольку main() выполняется в asyncio.run(), то исключение всплывает туда. Это исключение не имеет особого смысла вне asyncio, так что я полагаю, run() ловит это исключение и вместо него выбрасывает KeyboardInterrupt() как ближайший не-асинхронный эквивалент. Это исключение всплывает на верхний уровень и останавливает интерпретатор.

    Ты можешь ловить CancelledError в main(), чтобы спокойно завершить работу бота. Ну или ловить KeyboardInterrupt() в теле скрипта, на вызове asyncio.run().
    Ответ написан
    1 комментарий
  • Как подключить 2 коннектора в 1 сессии aiohttp?

    Vindicar
    @Vindicar
    RTFM!
    Из гитхаба aiohttp_proxy:
    class ProxyConnector(TCPConnector):
        def __init__(
            self, ..., 
            **kwargs
        ):
            ...
            super().__init__(**kwargs)
            ...

    Т.е. ProxyConnector наследует от TCPConnector и пробрасывает в него все неизвестные kwagrs-параметры.
    А раз так, ты можешь попробовать прокинуть ssl_context прямо в ProxyConnector.

    Правда, вопрос такой - для чего должен использоваться этот ssl_context? Для коннекта скрипта к прокси, или для коннекта к прокси к сайту? Потому что я сомневаюсь, что второе возможно.
    Ответ написан