• Как проверить ячейку бд на наличие конкретных данных Sql?

    Vindicar
    @Vindicar
    RTFM!
    Не стоит полагаться на возвращаемое значение cursor.execute().
    Выхлоп твоего запроса нужно получать через fetchone()/fetchall(), даже если запрос вернул одно значение.
    У тебя тогда в выдаче будет одна строка с одним столбцом. Выбираешь строку через fetchone(), у полученного значения берёшь нулевой столбец.
    Ответ написан
    Комментировать
  • Почему Python выдает ""(" was not closed"? хотя все нормально?

    Vindicar
    @Vindicar
    RTFM!
    У тебя в строке одинаковые одинарные кавычки - как вокруг всей строки, так и вокруг значения href. Так что https://www.google.com/ оказалось вне строковой константы. Будь внимательнее. И вообще, в HTML кавычки должны быть двойные.
    Ответ написан
    Комментировать
  • Почему дублируется слэш и не работают сырые строки?

    Vindicar
    @Vindicar
    RTFM!
    Обрати внимание, как ты выводишь значение.
    В питоне есть два строковых представления: str и repr.
    str - человекочитаемое представление. Его можно увидеть, сделав просто print(path). Сразу станет видно, что ничего не удваивается.
    repr, же, по идее, представляет объект так, что если его записать прямо в коде, как показано - получим обратно этот объект. Если это вообще возможно.
    В случае с числами разницы нет.
    В случае со строками - она будет. У тебя на скриншоте именно repr-представление строки - в кавычках, и с экранированием спецсимволов. При этом, записав такую константу, получишь ту же самую строку, что логично.
    Ведь 'a\\b' - это то же самое, что и r'a\b'.

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

    Vindicar
    @Vindicar
    RTFM!
    for i in range(word_count, 0, -1):
    На первой итерации цикла i примет значение word_count.
    Символы в строке word имеют индексы от 0 до word_count-1.
    Так что индекс, равный word_count, не существует. Ты поймаешь исключение IndexError.

    И можно ли его написать более компактно? Если да, то как?

    Освоить срезы (slice). part = word[a:b:c] будет (условно) эквивалентно
    part = ''
    i = a
    while i < b:
        part = part + word[i]
        i = i + c

    для положительного c. А для отрицательного будет while i > b:.
    Если a опущено, по умолчанию это начало последовательности (для c > 0) или конец (для c < 0).
    Если b опущено, по умолчанию это конец последовательности (для c > 0) или начало (для c < 0).
    Если c опущено, по умолчанию это 1.

    Так что для обращения строки нам нужно пройтись по всей строке с шагом -1. Получим вот что:
    word_reversed = word[::-1]
    # это эквивалентно
    word_reversed = word[len(word)-1:-1:-1]
    Ответ написан
    1 комментарий
  • Как соединить 2 python файла в один код?

    Vindicar
    @Vindicar
    RTFM!
    У тебя будет проблема в том, что во второй файл надо будет передать объект bot, которого, скорее всего, не будет на момент импорта этого файла.
    Есть не слишком изящный, но простой способ.
    # imported_file.py
    import telebot
    from telebot import types
    
    def setup(bot):  # setup() принимает бота и прочее как параметры.
        # да, прописываем обработчики прямо внутри setup()
        # но вот глобальные переменные здесь прописывать не стоит
        @bot.message_handler(content_types=['text'])
        def get_text_messages(message):
            ...
    
    # main_file.py
    import telebot
    from telebot import types
    import time
    
    import imported_file
    
    bot = telebot.TeleBot("ТОКЕН")
    # убедись, что setup() вызывается строго один раз для каждого дополнительного файла!
    imported_file.setup(bot)  
    ...  # дальше работаем как обычно


    Этот вариант позволяет загрузить файл уже в ходе работы бота, но не предусматривает возможности выгрузить файл на ходу. Впрочем, не все библиотеки позволяют отвязать обработчик от события, так что это не только проблема этого подхода.
    Ответ написан
    1 комментарий
  • Как с вм2 подключиться по ssh ключу к вм3, если закрытый ключ храниться на 1 вм?

    Vindicar
    @Vindicar
    RTFM!
    У некоторых SSH клиентов есть ключ -J, попробуй его.
    Альтернативно, установи первое соединение с пробросом порта на локальную машину, и коннекться ко второму хосту через проброшенный порт.
    Ответ написан
    2 комментария
  • Почему не создается БД при старте телеграм бота?

    Vindicar
    @Vindicar
    RTFM!
    просто в папке не создается таблица бд и на этом все.

    создает товар и сохраняет в бд без ошибок.

    Дай угадаю, коннект к базе делаешь командой вида sqlite3.connect('somefile.db')?
    Если так, то ты налетел на проблему относительных путей. Основы информатики, начальная школа.
    Путь somefile.db будет рассчитываться относительно текущего рабочего каталога, который может меняться в зависимости от способа запуска скрипта, да и просто в ходе его работы. А может не меняться. Т.е. нет гарантий, что текущий рабочий каталог будет совпадать с каталогом, где лежит скрипт.
    Лучше определить абсолютный путь к файлу самостоятельно.

    from pathlib import Path
    import sys
    
    SCRIPT_DIR = Path(sys.argv[0]).parent.resolve()  # каталог, где лежит выполняемый скрипт
    DB_PATH = SCRIPT_DIR / 'somefile.db'  # путь к файлу БД в этом каталоге
    
    conn = sqlite3.connect(DB_PATH)
    Ответ написан
    Комментировать
  • Как в консоли выбрать файл не вводя его имя?

    Vindicar
    @Vindicar
    RTFM!
    Используй Midnight Commander, у него есть командная строка и горячие клавиши для сброса в эту командную строку текущего выбранного файла в левой/правой панели.
    Ответ написан
    Комментировать
  • Ошибка: sqlite3.OperationalError: no such column: telegram_id: Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    CREATE TABLE IF NOT EXISTS не сработает, если таблица уже существует - но и только. Если она имеет неправильную структуру, данный вызов её не пересоздаст, а оставит как есть. Проверь структуру таблицы, либо через обращение к таблице схемы (хранит структуру всех таблиц к БД), либо подцепившись клиентом к твоей БД.
    Ответ написан
    Комментировать
  • Почему не изменяется значение переменной в python?

    Vindicar
    @Vindicar
    RTFM!
    class Enemy:
        ...
        def mobReturn(self): 
            self.x_mob = self.rect.x
    
    class Bullet(pygame.sprite.Sprite):
        def update(self):
            if x_mob>=100:

    В первом случае ты изменяешь атрибут экземпляра класса Enemy.
    Во втором случае ты читаешь локальную переменную метода update() класса Bullet.
    Это совершенно разные области видимости, они друг о друге ничего не знают.

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

    Во всех случаях проверку коллизии нужно будет делать каждый кадр. Так что в главном цикле игры надо будет перебирать активных врагов и активные пули, и проверять их. В простейшем случае - всех со всеми.
    Ответ написан
  • Вылет Python при возврате c_char_p из dll ctypes. Что не так?

    Vindicar
    @Vindicar
    RTFM!
    У тебя возвращаемая переменная размещена на стеке. Возможно, string умирает по выходу из функции, и уносит с собой выделенную строку, так что указатель к моменту возврата из функции уже ни на что не указывает.

    Если обратиться к функции из под C++, она сработает?
    # include <fstream>
    # include <string>
    using namespace std;
    
    const char* readfile(char* filename) {
      ifstream file;
      string lines, line;
      
      file.open(filename);
      if (file.is_open()) {
        while (file >> line) {
          lines += line;
        }
        file.close();
        return lines.c_str();
      } else {
        char* trashVar = "Bad open";
        return trashVar;
      }
    }
    
    int main()
    {
        cout << readfile("filename.txt");
        return 0;
    }
    Ответ написан
    4 комментария
  • У меня в программе ошибка не считает последную функцию не тот ответ как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Впридачу ко всему остальному выше:
    return clas 
    return name

    Отработает только первый return.
    Ответ написан
    Комментировать
  • Кнопка включения и выключения Python?

    Vindicar
    @Vindicar
    RTFM!
    При текущем устрйостве кода - никак.
    Я так понимаю, ты просто выполняешь скрипт AutoRebith, и больше с ним никак не взаимодействуешь. Поэтому и сказать ему "стоп" ты не можешь. Не зная, что творится в том скрипте, сказать ничего нельзя, но кое-что я всё же подскажу.

    1. Для работы оконного интерфейса поток приложения (обычно главный поток, в котором исполняется тело программы) должен выполнять цикл обработки сообщений. В твоём случае этот цикл спрятан в методе window.mainloop(). Но как следствие, нельзя выполнять длительные действия в обработчиках событий интерфейса! Т.е. по нажатию на кнопку нельзя просто взять и заняться чем-то на полчасика - окно программы на это время перестанет отвечать.
    Так что тебе придётся вытащить твою секретную операцию в отдельный поток выполнения, например, через модуль threading. Про это надо читать. Но тут ждёт вторая подстава - оконные приложения не любят обращения к элементам из нескольких потоков. Наладить общение между интерфейсом и потоком - отдельная задача.

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

    Могу показать упрощённый пример, как это делается. Но его нужно будет подгонять под свою задачу, и да, твой код придётся переписать почти с нуля.
    Пример
    import threading
    import tkinter
    from tkinter import ttk
    import time
    
    # Этот класс описывает длительную операцию, выполняемую в потоке.
    class LongRunningOperation(threading.Thread):
        # если твоя операция требует аргументы, они передаются через конструктор
        def __init__(self, my_argument):
            super().__init__(daemon=True)  # если главный поток завершился, мы тоже должны
            self._my_argument = my_argument  # и сохраняются в self
            self._stop_flag = threading.Event()  # а это - признак "Пора останавливаться"
            self._progress = 0  # эта переменная отслеживает прогресс
            # этот объект гарантирует, что наш и внешний потоки не будут трогать self._progress одновременно
            self._progress_lock = threading.Lock()  
        
        # От threading.Thread() мы унаследуем два важных метода
        #     start() вызывается снаружи потока и запускает наш поток
        #     wait() вызывается снаружи потока и ждёт, пока наш поток не остановится
        
        # Этот метод вызывается снаружи потока и сигнализирует об остановке
        # Но остановиться поток должен будет сам
        def stop(self):
            self._stop_flag.set()  # threading.Event безопасен для использования несколькими потоками.
        
        # Этот метод вызывается снаружи потока и позволяет узнать прогресс длительной операции
        def get_progress(self):
            with self._progress_lock:  # любые обращения к self._progress заворачиваются в такой блок
                # вообще, для чисел Lock не требуется. Но если ты хочешь сообщать что-то большее, это надо делать.
                return self._progress
        
        # Тело этого метода будет выполняться в отдельном потоке.
        # Именно этот метод реализует длительную операцию.
        def run(self):
            # я не знаю, что творится у тебя в коде. 
            # Тебе придётся адаптировать свой код под этот шаблон.
            self._progress = 0
            self._stop_flag.clear()
            print('Operation started')
            while not self._stop_flag.is_set():  # пока нам не сказали остановиться
                # Тут ты выполняешь порцию своей длительной работы. Например, одну итерацию цикла.
                print('Operation with my_argument =', self._my_argument)
                time.sleep(0.1)  # это просто для примера - ждём 0.1 секунды. 
                # Выше ты выполняешь порцию своей длительной работы. Например, одну итерацию цикла.
                with self._progress_lock:
                    self._progress += 1  # наращиваем прогресс
                    if self._progress == 100:
                        # в данном случае прерываем цикл, если прогресс дошел до 100 - дело сделано
                        # если у тебя цикл "пока снаружи не остановят", то условие и break можно убрать
                        break  
            print('Operation stopped')
    
    
    class MainWindow(tkinter.Tk):  # окно приложения
        def __init__(self):
            super().__init__()
            self._operation = None  # а вот тут будет храниться экземпляр класса LongRunningOperation
    
            self.title('Pet Clicker III')
            self.geometry('600x600')
            
            self._progress = tkinter.IntVar()  # переменная для прогресса в окне
            # прогрессбар подхватит эту переменную, так как мы её указали в параметрах
            self._progressbar = ttk.Progressbar(self, maximum=100, variable=self._progress, mode='determinate')
            self._progressbar.pack(side='top', expand=True, fill='x')
            
            self._button = tkinter.Button(self, text='Start', command=self._start_stop)  # кнопка пуск/стоп
            self._button.pack(side='top', expand=True, fill='x')
            
            self.after(500, self._check_progress)  # через 500 мс надо вызвать _check_progress()
            
        def _check_progress(self):  # показывает прогерсс операции в окне, если есть что показывать
            if self._operation is not None:  # операция сейчас выполняется?
                progress = self._operation.get_progress()
                self._progress.set(progress)  # задаём новое значение прогресса
                if not self._operation.is_alive():  # поток уже остановился?
                    self._progress.set(0)  # сбрасываем прогресс
                    self._button.config(text='Start')  # переименовываем кнопку
                    self._operation = None  # забываем про объект операции
            self.after(500, self._check_progress)  # ещё через 500 мс вызовем функцию снова
        
        def _start_stop(self):  # запускает или останавливает операцию
            if self._operation is None:  # операции нет - запускаем её
                self._operation = LongRunningOperation(42)  # передаём аргументы в операцию. В нашем случае my_argument = 42.
                self._progress.set(0)  # сбрасываем прогресс
                self._button.config(text='Stop')  # переименовываем кнопку
                self._operation.start()  # запускаем второй поток, который будет выполнять операцию
            else:  # операция уже запущена - останавливаем её
                self._operation.stop()  # даём сигнал "остановись"
                self._operation.join()  # ждём, пока она действительно не остановится
                self._progress.set(0)  # сбрасываем прогресс
                self._button.config(text='Start')  # переименовываем кнопку
                self._operation = None  # забываем про объект операции
    
    wnd = MainWindow()
    wnd.mainloop()
    Ответ написан
  • JSON io.UnsupportedOperation: not readable почему выводиться данная ошибка JSON?

    Vindicar
    @Vindicar
    RTFM!
    with open('values.json') as json_file:
    Для чего открываешь файл? Чтение? Запись? Надо указывать.
    Ответ написан
  • Как можно оптимизировать код для склейки видео по запросу пользователя?

    Vindicar
    @Vindicar
    RTFM!
    a = VideoFileClip("./Video/a.mp4")
    b = VideoFileClip("./Video/b.mp4")

    1. Если ты ловишь себя на создании переменных такого вида, тебе нужна коллекция. Открой для себя словари (dict).

    2. Что мешает подставить введённую строку в имя файла?
    Ответ написан
    1 комментарий
  • Возможно ли добавить функцию в бота aiogram, которая будет удалять/изменять текст сообщения?

    Vindicar
    @Vindicar
    RTFM!
    Нужно хранить в БД ID всех сообщений бота консультантам, которые описывают данную заявку. При обработке заявки пройтись по списку ID для данной заявки и удалить сообщение (ну или отредактировать).
    Простейшая таблица вида "ID сообщения - ID заявки" тут справится.
    Ответ написан
    2 комментария
  • Aiogram как отправлять заранее заготовленное сообщение каждый день?

    Vindicar
    @Vindicar
    RTFM!
    1. Записать в переменной ID получателя.
    2. Разобраться, как отправить сообщение по заранее известному ID.
    3. Разобраться, как пользоваться aioschedule.
    Ответ написан
    Комментировать
  • Как сделать так, что бы обновлялось всё время?

    Vindicar
    @Vindicar
    RTFM!
    Я написал такой код:

    Не верю. (с)

    Если бы ты сам его написал, ты бы знал, что у тебя там сначала вечный цикл while True, который прерывается только если нажата клавиша (cv2.waitKey()) с кодом 27, т.е. Esc. Но этот цикл только читает кадр и показывает его в окне. А всё распознавание идёт уже после этого цикла. И там же вывод одного кадра и ожидание любой клавиши.

    Если нужно, чтобы операция выполнялась для каждого кадра - она должна быть внутри цикла по кадрам. Логично?
    Ответ написан
  • Как выполнить нужный из директорий скрипт в зависомости от переданного аргумента?

    Vindicar
    @Vindicar
    RTFM!
    А) Запускай скрипт как суб-процесс через os.system() / subprocess / вариации на тему. Годится, если скрипт-сервис должен быть изолирован от основного скрипта.
    Б) импортируй модуль через importlib. Каждый модуль должен иметь точку входа, скажем, класс или функцию с заданным именем, которую основная программа активирует. Более тесное взаимодействие, со всеми плюсами и минусами.
    Ответ написан
    Комментировать
  • Почему создавая виртуальное окружения, не работает pip?

    Vindicar
    @Vindicar
    RTFM!
    Укажи в команде полный путь до pip в виртуальном окружении.
    Ответ написан