Задать вопрос
  • Не запускается код скомпилированный с помощью pyinstaller на другом компе, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Код написан чат гпт4, я не программист

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

    Но да, вполне может быть, что проблема в этом:
    # Привязываем сокет к определенному адресу и порту
    server_address = ('192.168.1.32', 12345)
    server_socket.bind(server_address)

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

    сделать программу для получения информации от клиента и записи ее в txt файл

    Что за информация? Как она получается? Критично ли именно в txt файл?
    В простейшем случае может хватить и гугл-формы.

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

    Vindicar
    @Vindicar
    RTFM!
    subprocess.run() совмещает стандартный вывод твоего скрипта и вызываемого тобой процесса. Если они используют разные кодировки, чей-то вывод превратится в кашу.
    Используй capture_output, тогда ты получишь вывод скрипта в виде строки, которую сможешь сам декодировать, если надо.
    Ответ написан
    Комментировать
  • Почему бот перестал отвечать после добавления клавиатуры?

    Vindicar
    @Vindicar
    RTFM!
    У тебя две функции отмечены как
    @bot.message_handler(content_types=['text'])
    telebot в случае подобного конфликта (две функции готовы обслужить одно и то же событие) всегда вызывает первую из них.
    Тебе придётся объединить логику этих функций в одной функции.
    Ответ написан
    Комментировать
  • Требуется захват вывода команды в subproccess python в реальном времени как реализовать?

    Vindicar
    @Vindicar
    RTFM!
    Используешь Popen(), перехватываешь ввод-вывод (stdin, stdout и stderr, передаёшь туда константу PIPE). Дальше используешь свойства stdin, stdout, stderr - это файлоподобные объекты (пайпы).
    Тут есть ряд подводных камней. Обычно чтение из файла - блокирующая операция, т.е. пока дочерний процесс не напишет что-то в пайп - твоя программа будет висеть и не реагировать на действия пользователя. В питоне неблокирующее чтение из пайпа доступно только под unix, а под виндой - только начиная с 3.12. Если нужна поддержка винды, будет практичнее запустить отдельный поток, который читает данные из процесса. Например, так:

    import collections
    import signal
    import subprocess
    import threading
    import time
    
    
    class ChildProcessReader(threading.Thread):
        def __init__(self, args: list[str], *, encoding: str | None = None, errors: str = 'ignore', exit_timeout: float = 1.0):
            super().__init__(name=f'Monitor {args!r}', daemon=True)
            self._encoding = encoding
            self._errors = errors
            self._exit_timeout = exit_timeout
            self._queue = collections.deque()
            self._child = subprocess.Popen(args,
                stdin=subprocess.DEVNULL,  # стандартный вход отключен
                stdout=subprocess.PIPE,  # перехватываем стандартный вывод
                stderr=subprocess.STDOUT,  # стандартный вывод ошибок направляем на стандартый вывод
            )
            self.start()
        
        @property
        def running(self) -> bool:
            '''Возвращает True, если процесс ещё жив.'''
            return self._child is not None
        
        @property
        def output(self) -> collections.deque:
            '''Очередь, в которую будут складываться получаемые от процесса строки.'''
            return self._queue 
        
        def stop(self) -> None:
            '''Останавливает процесс - сначала "по хорошему", потом принудительно.'''
            if self._child is None:
                return
            try:
                self._child.send_signal(signal.CTRL_C_EVENT)
                self._child.wait(self._exit_timeout)
            except subprocess.TimeoutExpired:
                self._child.terminate()
            except KeyboardInterrupt:
                pass
            finally:
                self._child = None
        
        def run(self) -> None:
            '''Тело потока.'''
            try:
                while self._child.poll() is None:  # рабочий цикл крутится, пока дочерний процесс жив.
                    stdout_data = self._child.stdout.read1()
                    if self._encoding is not None:
                        stdout_data = stdout_data.decode(self._encoding, errors=self._errors)
                    self._queue.append(stdout_data)
            except KeyboardInterrupt:
                pass
            finally:  # по выходу из цикла завершаем процесс
                self.stop()
    
    
    if __name__ == '__main__':
        child = ChildProcessReader(
            # выполняемая команда
            ['ping', '-t', '127.0.0.1'],
            # кодировка, в которой отдаёт данные твой процесс. None - отдавать байты как есть.
            encoding='cp866', errors='ignore',
            # сколько ждать завершения процесса
            exit_timeout=1.0
        )
        # процесс (и поток) стартуют немедленно по созданию экземпляра класса
        try:
            while child.running:
                # вместо просто цикла тебе лучше периодически выполнять код ниже иным способом
                # например, если у тебя GUI на tkinter, используй метод .after()
                try:  # пытаемся получить очередную строку от процесса
                    data = child.output.popleft()
                except IndexError:  # ничего нет, буфер пуст
                    # это просто реакция на отсутствие текста. Можно вообще ничего не делать.
                    print('.', end='', flush=True)
                    time.sleep(0.1)  # 
                else:  # получили строку, обрабатываем
                    print(f'\n> {data!r}')
        except KeyboardInterrupt:
            print('\nStopping')
        finally:  # в итоге надо будет прибить дочерний процесс
            child.stop()
    Ответ написан
    Комментировать
  • Как сделать выбор монитора для полноэкранного приложения python arcade?

    Vindicar
    @Vindicar
    RTFM!
    window.set_fullscreen()?
    screen – Which screen should we display on? See get_screens()

    Т.е. при вызове метода set_fullscreen() передаёшь в параметр screen элемент из списка get_screens().
    Ответ написан
  • Как привязать телеграм бота к программе на C#?

    Vindicar
    @Vindicar
    RTFM!
    Я подозреваю, что для работы бота требуется запустить его рабочий цикл. Без него методы бота работать не будут. Подробнее читай в доках на используемую тобой библиотеку (которую ты не потрудился указать).
    А вообще, API телеги - это просто HTTP запросы, ты можешь попробовать сделать запрос вручную.
    Например, послать POST запрос на адрес
    https://api.telegram.org/botТОКЕН_ТВОЕГО_БОТА/sendMessage
    с телом
    chat_id=ID_получателя&text=текст_сообщения_в_url_кодировке
    Ответ написан
    Комментировать
  • Почему возникает ошибка "got an unexpected keyword argument 'use_context'"?

    Vindicar
    @Vindicar
    RTFM!
    Ты уверен, что туториал, по которому ты писал бота, рассчитан на ту же версию, что и используемая тобой?
    Может, у тебя либа сильно новее, чем та, на которую код рассчитан?
    Ответ написан
    Комментировать
  • Как заполнить sql таблицу на Python SQLAlchemy?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Почему не работает скрипт python при запуске из crontab?

    Vindicar
    @Vindicar
    RTFM!
    в лог пишется инфа из скрипта, что создал папку/записал файл, но по факту этого нет при запуске скрипта из кронтаба, т.е. запись об успехе есть, а папки/файла нет

    Т.е. скрипт создал папку неизвестно где. Относительные пути используешь?
    Исправь скрипт так, чтобы он писал в лог полный путь к создаваемому файлу.
    Ответ написан
    3 комментария
  • Что делать, не работает telebot python?

    Vindicar
    @Vindicar
    RTFM!
    Так telebot вроде синхронный, а не асинхронный фреймворк?
    Ответ написан
  • Как работают генераторы в Пайтон?

    Vindicar
    @Vindicar
    RTFM!
    join() вызывает под капотом list() на переданном генераторе, а list() опрашивает весь генератор.
    Так что сначала генерится список вида ['0', '1', '2', '3', '4', '5', '6', '7'], что позволяет сразу рассчитать объём памяти, нужный для итоговой строки. Потом по этому списку уже формируется итоговая строка.
    Ответ написан
    1 комментарий
  • Как разделить текст на предложения в Python при этом же не учитывать точки после сокращений и инициалов?

    Vindicar
    @Vindicar
    RTFM!
    каким-то регулярным выражением

    Читаем, просвещаемся.

    А вообще без примера текста не очень-то порешаешь. Вот, скажем: "Он родился в 1986 г." - точка после сокращения, но она значима. Или, скажем, "Джон Ф. Кеннеди" - после точки идёт длинное слово с заглавной буквы, но точка не значима.
    В принципе, если первый приведённый случай не считается, то можно сказать, что за разделители предложений принимаются только точки, перед которыми идёт более двух букв, а также многоточия, знаки вопроса и восклицания, после которых идёт пробел. Для начала сойдёт, дальше можно уточнять.
    Ответ написан
    2 комментария
  • Как определить фамилию из строки?

    Vindicar
    @Vindicar
    RTFM!
    Я бы начал с natasha/yargy
    Ответ написан
    Комментировать
  • Как сделать кайот-джамп?

    Vindicar
    @Vindicar
    RTFM!
    Фиксировать момент, когда игрок последний раз оторвался от земли и причину. При прыжке сравнивать с текущим временем и прыгать только если это было достаточно недавно и только по причине схода с платформы.
    Ответ написан
    Комментировать
  • Как получить результат команды os.system в Python?

    Vindicar
    @Vindicar
    RTFM!
    Я попытался решить проблему через subprocess, но толи subprocess не хочет работать с кириллицей

    Ставь кодировку CP866.
    Ответ написан
  • Как получить следующее сообщение, отправленное ботом?

    Vindicar
    @Vindicar
    RTFM!
    Не имел дела с VKBottle, но я здорово подозреваю, что функция отправки сообщения возвращает объект, описывающий отправленное сообщение. Возьми id оттуда.
    Ответ написан
    3 комментария
  • Как вызвать функции из другого файла без импорта переменных в которых вызывается модель ИИ?

    Vindicar
    @Vindicar
    RTFM!
    Что значит "работал отдельно и был запущен"? В приведённом коде нет ничего, что требовало бы постоянной работы ai.py. Если в реальном коде есть что-то ещё, т.е. файл не завершается немедленно, а крутится в рабочем цикле, то так и пиши.

    Если ты импортируешь ai.py из другого файла, он выполнится, но только один раз, при первом импорте.
    Различить две ситуации (выполнение при запуске и выполнение при импорте) можно по встроенной переменной __name__.
    if __name__ == '__main__':
        print('Этот файл выполняется непосредственно.')
    else:
        print('Этот файл импортируется.')

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

    Vindicar
    @Vindicar
    RTFM!
    Правильное решение - иметь словарь функций.
    funcs = {
        'test': test
    }
    
    cmd = input('Введите команду: ')
    func = funcs.get(cmd, None)
    if func is None:
        print(f'неизвеcтная команда {cmd}')
    else:
        try:
            result = func()
        except Exception as err:
            print("Ошибка:", err)
        else:
            print("Результат:", result)
    Ответ написан
    1 комментарий
  • Как вызвать функцию, чтобы код (бот) продолжал работу?

    Vindicar
    @Vindicar
    RTFM!
    Загони код распознвания речи в отдельный поток с помощью asyncio.get_event_loop().run_in_executor()
    Ответ написан
    4 комментария