Задать вопрос
Ответы пользователя по тегу Python
  • Как сохранить полное форматирование текста при его копировании?

    Vindicar
    @Vindicar
    RTFM!
    Как насчёт вместо message.text посмотреть в message.text_markdown или message.text_html (доки)? Ну и соответственно указать не text, а markdown или html при вызове send_message().
    Ответ написан
    4 комментария
  • Как запустить плагин на Python через консоль?

    Vindicar
    @Vindicar
    RTFM!
    В комментариях тебе совершенно правильно написали - сначала гугл, потом вопросы.
    Так что окей, гугл, python в exe. На первой же странице выдачи достаточно информации, чтобы начать.

    А я добавлю:
    Если запускать через cmd не работает

    Как именно не работает? Виснет? Ничего не происходит? Синий экран? Комп встаёт со стола и уходит искать Сару Коннор? На будущее, чем точнее и подробнее ты опишешь проблему, а также предпринятые тобой попытки её решить - тем больше шансов получить ответ.
    Ответ написан
    1 комментарий
  • Почему асинхронный телебот увеличивает кол-во потоков?

    Vindicar
    @Vindicar
    RTFM!
    while True:
                print(1)
                await asyncio.sleep(1)

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

    Vindicar
    @Vindicar
    RTFM!
    Циклический импорт, вызванный глобальными переменными.
    Вместо того, чтобы использовать глобальные переменные, вынеси код в функции, и передавай им нужные объекты явно. Тогда модулю, содержащему функции, не нужно будет импортировать модуль, содержащий переменные. А там, глядишь, дойдёшь и до классов.
    Ответ написан
    Комментировать
  • Как получить описание устройства в системе через python?

    Vindicar
    @Vindicar
    RTFM!
    Я бы поискал в реестре, в ветке
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{4d36e978-e325-11ce-bfc1-08002be10318}
    . Во вложенных ветках будет свойство DeviceInstance, собираешь значения этого свойства. Затем заглядываешь в
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\сюда вставляешь значение DeviceInstance\Device Parameters
    , там можно найти имя порта и еще кое-что полезное.

    Модуль winreg под виндой идёт из коробки.
    Ответ написан
    Комментировать
  • Почему не удается распознать лицо из базы данный с веб-камеры?

    Vindicar
    @Vindicar
    RTFM!
    1. Как у тебя устроена "база данных" лиц? Ты указываешь относительный путь к ней - ты уверен, что программа корректно этот путь обрабатывает? Будет ли лучше работать, если указать абсолютный путь к каталогу с эталонными фото?
    2. Насколько качественное изображение идёт с вебки? Если лицо занимает три с половиной пикселя, никакая сеть не справится. По-хорошему тебе стоило поэкспериментировать, постепенно уменьшая размер входных изображений и фиксируя процент ошибок. Это дало бы ответ на вопрос "насколько крупным должно быть лицо, чтобы его уверенно распознавало".
    Ответ написан
  • Как зная IP и порт проверить в сети устройства или нет через Python?

    Vindicar
    @Vindicar
    RTFM!
    Если программа, работу которой ты проверяешь, использует протокол на базе TCP (скажем, HTTP), ты можешь попробовать установить TCP-соединение на эту пару адрес:порт, не отправляя никаких данных. Уже можно будет понять, установилось соединение или было отвергнуто.

    Если это не разовая задача, а периодическая, я советую использовать нормальные системы мониторинга. Хотя бы monit, чтобы не возиться с zabbix. Обе умеют проверять подобное.

    Правда, всё выше сказанное верно только для заранее известных IP-адресов. Если у тебя ситуация в духе "где-то в подсети 192.168.69.0/24", то дело усложняется.
    Ответ написан
    3 комментария
  • Как подключить сервер?

    Vindicar
    @Vindicar
    RTFM!
    Я заметил, что ты настроил доступ по ODBC, а коннектишься используя драйвер, который называется просто SQL Server. Я не уверен, что это одно и то же.
    В майковских доках в строке соединения используется другой драйвер, ODBC Driver 18 for SQL Server.
    server = 'Serv'
    database = 'resource'
    username = ''
    password = ''
    connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}'
    cnxn = pyodbc.connect(connectionString)

    Напоминаю, {{двойные фигурные скобки}} в f строках просто превращаются в одинарные, а вот одинарные обеспечивают подстановку переменных.
    Ответ написан
  • Как нарисовать круг в turtele, чтобы он удалялся и заново рисовался до бесконечности?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужно, чтобы круг рисовался медленно? Вызывай circle() несколько раз, с задержкой и с параметром extent. Этот параметр задаёт угол дуги в градусах, которую нужно нарисовать. Если задать 360 или не задать вообще, нарисует окружность целиком, если задать 180 - нарисует пол-окружности, и так далее. А значит, можно легко нарисовать окружность из N сегментов:
    N = 18
    R = 200
    for _ in range(N):
        turtle.circle(R, 360 / N)
        time.sleep(0.1)

    Чтобы стереть, смени цвет рисования на цвет фона, скажем так: turtle.pencolor("white").
    После этого нарисуй ещё один круг в той же позиции.
    Ответ написан
    Комментировать
  • Почему метод strip в Python так работает?

    Vindicar
    @Vindicar
    RTFM!
    либо строку, которая передана в качестве аргумента.

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

    Vindicar
    @Vindicar
    RTFM!
    Проблема в том, что ты пытаешься сделать бота и скриптом, и модулем. А импорт работает только одним способом.
    Я бы сказал, просто вынеси main в папку выше (ну или остального бота в подпапку).
    Тогда бот будет модулем, а главный скрипт - скриптом.

    Не, ты, конечно, можешь в __init__ написать изврат в духе
    try:
        from .wtf import stuff
    except ImportError:
        from wtf import stuff

    И сделать в main from __init__ import *
    Но не надо так делать. Пожалеешь потом.
    Ответ написан
    1 комментарий
  • Как реализовать базовый класс для динамического создания подклассов без вызова рекурсии в Python?

    Vindicar
    @Vindicar
    RTFM!
    Пусть родительский класс имеет классовую переменную, храняющую список известных классов потомков и ассоциированные с ними данные.
    Потомки должны будут регистрировать себя в этой коллекции - либо явно (через метод или декоратор), либо неявно, через метакласс. Тогда родительский класс будет перебирать эту коллекцию в поисках "подходящего" класса-потомка и создавать его.

    Пример:
    class Parent:
        known_children = []  # список классов-потомков Parent
        @staticmethod
        def register(klass):  # декоратор для регистрации классов-потомков
            Parent.known_children.append(klass)
            return klass
        @classmethod
        def can_handle(cls, data):  # "эй, потомок, ты можешь себя создать из этих данных?"
            raise NotImplementedError()
        @staticmethod
        def make(data):  # создаёт экземпляр одного из потомков
            for child in Parent.known_children:
                if child.can_handle(data):  # потомок согласился обработать данные?
                    return child(data)  # вызываем конструктор класса-потомка 
            else:  # относится к for ... in !
                raise TypeError(f'Никто не знает, что делать с этим:\n{data!r}')
        # тут остальная начинка класса
        ...
    
    # а это пример потомка
    @Parent.register  # явная регистрация потомка через декоратор
    # так удобнее, потому что так можно создавать промежуточных потомков,
    # которые не будут реально использоваться - только в наследовании
    class SomeChild(Parent):
        @classmethod
        def can_handle(cls, data):
            return data.get('name', None) == 'SomeChild'  # критерий для определения - наш случай или нет?
        
        def __init__(self, data):
            self.x = data['x']
            self.y = data['y']
    
    c = Parent.make({'name': 'SomeChild', 'x': 42, 'y': 69})  # создаст экземпляр SomeChild
    print(c)
    try:
        Parent.make({'name': 'invalid'})  # потерпит неудачу
    except TypeError as err:
        print(err)
    Ответ написан
    Комментировать
  • Как в пайтон вводя имя переменной вызвать её?

    Vindicar
    @Vindicar
    RTFM!
    Замечу, что в таких случаях лучше использовать словарь.
    Ответ написан
    3 комментария
  • Как отфильтровать текст Python?

    Vindicar
    @Vindicar
    RTFM!
    Регулярные выражения в Питоне
    import re
    
    pattern = re.compile(r'^\d+\.\s+')  # начало строки, 1+ цифра, точка, 1+ пробел
    # re.compile() можно сделать один раз, а потом переиспользовать полученный pattern
    text = '1. Салат 1'
    result = pattern.sub('', text)  # заменяем пустой строкой подходящие под шаблон части text
    print(result)
    Ответ написан
    2 комментария
  • Не отображаются виджеты, приложение виснет, где ошибка?

    Vindicar
    @Vindicar
    RTFM!
    def setting(self):
        self.server.check_currency()
        ...
        self.setting()

    Что это за *непроизносимое марсианское ругательство*?
    Во-первых, ты реализуешь (вечный?) цикл через рекурсию, что само по себе глупо. Рекурсия куда более ограниченная штука, хотя бы из-за глубины стека.
    Во-вторых, у тебя именно что бесконечный цикл - ты не даёшь программе передышки, чтобы она могла отрисовать окно. По сути, у тебя выполнение зациклится намертво на строке window1 = Kurz(), так как приложение уйдёт в рекурсивный вызов self.setting() и из него уже не вернётся.

    Первая же ссылка в гугле по запросу "pyqt timer" даёт пример, как периодически обновлять содержимое окна, используя QTimer.

    Сначала читай, потом думай, потом уже бросайся делать.
    Ответ написан
    Комментировать
  • Как можно в Tesseract улучшить распознавание желтого шрифта на красном фоне?

    Vindicar
    @Vindicar
    RTFM!
    Перевести желтое-на-красном в чёрное-на-белом. Если цвета всегда одинаковые, то можно просто найти разность между цветом каждого пикселя и эталоном, и по ней судить о яркости: похоже = чёрное, непохоже = белое, или наоборот.
    Ответ написан
    Комментировать
  • Как пофикисить ошибку запуска телеграм бота на VDS на постоянной основе?

    Vindicar
    @Vindicar
    RTFM!
    Ну у тебя явно два разных окружения.
    Просто python3 bot.py, без activate и прочего, использует системное окружение.
    А в приведённом тобой systemd-модуле явно видно виртуальное окружение.
    Так куда ты поставил openai - в системное или в виртуальное?
    Для установки в виртуальное используй pip из этого окружения.
    Ответ написан
    1 комментарий
  • Как найти чат, возвращающий ошибку "ApiError: 917" с помощью логирования?

    Vindicar
    @Vindicar
    RTFM!
    Заверни вызов метода в try - except, в ветке except пиши в журнал (хоть стандартынй модуль logging, хоть просто в файл) id чата, с которым пытался работать.
    Ответ написан
    Комментировать
  • Что я сделал не так?

    Vindicar
    @Vindicar
    RTFM!
    В-нулевых, пиши симптомы ошибки.
    Во-первых, simpleDividers(n)[len(simpleDividers(n))+1]
    Тебе что, палец отрезают за каждую использованную локальную переменную?
    Зачем два раза вычислять simpleDividers(n)? Почему не закинуть результат в переменную?
    Во-вторых, ты пытаешься обратиться к элементу списка с номером, превышающим его длину (потому что +1).
    Т.е. если у числа три делителя, ты бы обратился к номеру 4. Как по-твоему, это получится сделать?
    В-третьих, ты не возвращаешь answer через return при возврате из simpleDividers(), а код ниже написна так, словно ты его возвращаешь.
    Ответ написан
    Комментировать
  • Почему python возвращает существующий объект, вместо создания нового?

    Vindicar
    @Vindicar
    RTFM!
    А разгадка проста - сборщик мусора.
    Созданный тобой set() уничтожается сразу же после выхода из функции id(), так как на него не остаётся ссылок.
    Следующий set() создаётся по свежеосвобождённому адресу, а потому имеет тот же самый id().

    Ну и да, set() не является hashable(), а потому не может быть ключом в словаре.

    sets = [set() for _ in range(3)]
    for s in sets:
        print(id(s))

    Этот код выведет разные id(), потому что ссылки на объекты остаются в списке sets(), а значит, новые множества создаются не там же, где старые.
    Ответ написан
    Комментировать