• Как сконвертировать проект в пайчарм в exe файл?

    Vindicar
    @Vindicar
    RTFM!
    Гугл python to exe не помог? Или не пробовал?
    Есть Pyinstaller - это утилита командной строки.
    Есть auto-py-to-exe - GUI для неё.

    Вообще нужно иметь ввиду, что питон - это НЕ компилируемый язык. Твой exeшник будет самораспаковывающимся архивом, несущим в себе интерпретатор питона и все библиотеки, которые ты подключил. Это будет как минимум громоздко.
    Ответ написан
    3 комментария
  • Проблема с кодом на Python ошибка после компиляции в Exe для windows 10?

    Vindicar
    @Vindicar
    RTFM!
    # определяем функцию, которая загружает расписание из файла
    def load_schedule():
        try:
            ...  # реальная ошибку у тебя где-то здесь!
        except FileNotFoundError:  # но при ошибке ты глотаешь исключение и молча возвращаешь None
            return None, None
    
    def check_schedule2():
        start_time, end_time = load_schedule()
        ...  # а тут не проверяем, вернула ли функция значение или None

    Выстрел в ногу удался, что тут скажешь. Сначала скрыл истинную причину ошибки за молчаливым return None, потом не стал проверять, что вернулось, а теперь столкнулся с этим None ниже по коду и пытаешься понять, что произошло.

    А еще да, сравнение строк производится лексикографически (посимвольно). Т.е. строка "2" будет больше чем "12". Конкретно в твоём случае это сработает, так как у тебя будет "02", а не "2" для двух часов, но так делать всё равно неправильно. Я бы рекомендовал почитать про класс datetime.datetime (модуль datetime), его экземпляры можно сравнивать напрямую.
    Ответ написан
    Комментировать
  • Почему не работает код?

    Vindicar
    @Vindicar
    RTFM!
    if time <= time_15:

    По логике должно быть if time > time_15:
    Ответ написан
    Комментировать
  • Как скачать видео с ВК с помощью пайтон?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри в сторону youtube-dl. Она поддерживает не только YT, но и другие сайты, в том числе ВК. Плюс её можно использовать и как отдельную утилиту, и импортировать её в свой скрипт.
    Ответ написан
  • Как получить и форматировать цену с копейками на python?

    Vindicar
    @Vindicar
    RTFM!
    Ну можно сделать регулярку. Но вообще тебе правильно подсказывают: сделай валидацию ввода! Всё равно юзеров не перехитришь, с них станется прописью ввести.
    import re
    from decimal import Decimal  # не используй float для денег!
    
    sum_regexp = re.compile(r'^((?:\D*\d+)+?)(?:\D+(\d{2}))?\D*$')
    
    def string_to_sum(s: str) -> Decimal:
        match = sum_regexp.match(s)
        if match is None:
            raise ValueError(f'Not a correct sum: {s!r}')
        integer_part = re.sub(r'\D', '', match.group(1))
        fraction = match.group(2) or '00'
        fixed_string = f'{integer_part}.{fraction}'
        return Decimal(fixed_string)
    
    
    tests = {
        '0': Decimal('0.0'),
        '1000': Decimal('1000.0'),
        '10.00': Decimal('10.0'),
        '10,00': Decimal('10.0'),
        '1 000': Decimal('1000.0'),
        '1,000,000.00': Decimal('1_000_000.00'),
        '1000 рублей 90 копеек': Decimal('1000.90'),
    }
    
    for inp, res in tests.items():
        print(inp, end=': ')
        try:
            actual_res = string_to_sum(inp)
        except ValueError as err:
            print('Exception: ', err)
        else:
            if res != actual_res:
                print('Mismatch, got', actual_res)
            else:
                print('OK')
    Ответ написан
    Комментировать
  • С какой библиотекой можно обработать в сообщение в определенном месте в телеграмме?

    Vindicar
    @Vindicar
    RTFM!
    На stackoverflow есть пример для aiogram, легко гуглится.
    import logging
    from aiogram import Bot, Dispatcher, executor, types, utils
    
    API_TOKEN = 'replace_this_with_your_api_token'
    
    # Configure logging
    logging.basicConfig(level=logging.INFO)
    
    # Initialize bot and dispatcher
    bot = Bot(token=API_TOKEN, parse_mode="html")
    dp = Dispatcher(bot)
    
    def get_keyboard():
        keyboard = types.ReplyKeyboardMarkup()
        button = types.KeyboardButton("Share Position", request_location=True)
        keyboard.add(button)
        return keyboard
    
    @dp.message_handler(content_types=['location'])
    async def handle_location(message: types.Message):
        lat = message.location.latitude
        lon = message.location.longitude
        reply = "latitude:  {}\nlongitude: {}".format(lat, lon)
        await message.answer(reply, reply_markup=types.ReplyKeyboardRemove())
    
    @dp.message_handler(commands=['locate_me'])
    async def cmd_locate_me(message: types.Message):
        reply = "Click on the the button below to share your location"
        await message.answer(reply, reply_markup=get_keyboard())
    
    if __name__ == '__main__':
        executor.start_polling(dp, skip_updates=True)
    Ответ написан
  • Как получить id bios в python?

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

    Если тебе нужна защита от копирования, посмотри в сторону pyarmor. Но имей ввиду, pyarmor тоже отрывается при желании.
    Ответ написан
  • Как отобразить работу скрипта Python запущенного через systemctl?

    Vindicar
    @Vindicar
    RTFM!
    ОП, ты хочешь странного. Осознай, что демоны (а systemd управляет как раз программами типа daemon) по определению не предназначены для взаимодействия непосредственно с пользователем, в частности через терминал. А значит, у тебя два выхода:

    1. Перестать хотеть странного, и реализовать нормальные логи и анализировать их. Тогда можно будет в любой момент посмотреть историю, выведенную в лог.
    При необходимости отслеживать файл лога в реальном времени можно использовать команду tail -f файл.log. Почитай про неё.
    Также можно натравить на лог какую-нибудь утилиту мониторинга, которая будет его читать и посылать тебе оповещения о событиях по другому каналу.
    Если лог большой, есть logrotate.
    Минус - специфические терминальные фишки в логе работать не будут. Скажем, прогрессбар там не сделаешь, и ввести текст не получится.

    2. Отказаться от запуска программы как классического демона, и запускать её через утилиту screen. Тогда ты сможешь сконнектиться к сессии screen когда угодно.
    Плюс - взаимодействие с терминалом как обычно. В том числе из разных ssh сессий.
    Минус - screen не самая удобная штука, сочетания клавиш там мозголомные. Плюс всё равно запуск screen придётся заворачивать в systemd если тебе нужен автозапуск и автоперезапуск.
    Ответ написан
    4 комментария
  • Почему не работает код?

    Vindicar
    @Vindicar
    RTFM!
    В твоём коде показано, как определить класс объекта. Смотри, как формируется prediction_text.
    А дальше просто. Храни в глобальной переменной время, когда был сохранён последний снимок объекта с желаемым классом.
    Если у тебя на текущем кадре есть объект с желаемым классом, проверь текущее время. Если прошло 30 секунд с последнего сохранения - сохрани новый снимок, и обнови время последнего сохранения на текущее.
    Ответ написан
    Комментировать
  • Как сменить директорию (Ubuntu) на хостинге beget?

    Vindicar
    @Vindicar
    RTFM!
    Ты используешь относительный путь, т.е. путь относительно текущего рабочего каталога.
    Ты уверен, что каталог существует, и существует именно там где ты ищешь?
    Например, если ты находишься в каталоге /home/root, и делаешь cd ../folder/folder2, ты будешь пытаться перейти в каталог /home/folder/folder2.
    Ответ написан
    1 комментарий
  • Как разобрать mp3 файл?

    Vindicar
    @Vindicar
    RTFM!
    mp3 вряд ли выйдет. Там слишком много частот.
    Попробуй сначала midi.
    Ответ написан
    Комментировать
  • Как решить проблему?

    Vindicar
    @Vindicar
    RTFM!
    Входной файл, который ты грузишь вызовом users = json.load(f) записан не в кодировке utf-8. или переделай его, чтобы был в utf-8, или выясни его кодировку и укажи её при открытии файла.
    Ответ написан
  • Пишу код для счастливых билетов, но в коде что-то не то и циклы не работают после 000000, в чём проблема?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, у тебя уехали циклы, начиная с о второй цифры. Они не внутри общего цикла.
    Далее, ты можешь заменить 6 циклов на один, просто по числам от 0 до 999999.
    for number in range(0, 1_000_000):
        str_number = f'{number:0>6}' # превращаем число в строку, добивая нулями слева до 6 знаков
        digits = list(map(int, str_number))  # каждый символ строки превращаем в отдельное число, т.е. цифру
        d1, d2, d3, d4, d5, d6 = digits  # распаковываем список цифр в отдельные переменные


    Ещё ты можешь перебирать первые 5 цифр, а шестую цифру вычислять - сумма первых трёх минус четвёртая и минус пятая . Если результат в диапазоне 0-9, то это и будет шестая цифра.

    Если же ты предпочтёшь перебирать 5 цифр отдельными циклами, то стоит делать иначе.
    Первые 3 цифры перебираешь полным циклом, 4я цифра не должна превышать сумму первых 3х, 5я цифра не должна превышать сумму первых 3х - 4ю цифру. 6ю цифру вычислишь.
    for d1 in range(10):
        for d2 in range(10):
            for d3 in range(10):
                for d4 in range(min(9, d1+d2+d3) + 1):
                    for d5 in range(min(9, d1 + d2 + d3 - d4) + 1):
                        d6 = d1 + d2 + d3 - d4 - d5
                        if 0 <= d6 <= 9:
                            print(f'{d1}{d2}{d3}{d4}{d5}{d6}')


    Аналогично, можно заметить, что не всегда имеет смысл перебирать 4-5 цифры с нуля. Пример: если первые три цифры 299, то четвёртая не может быть 0 или 1 - в этом случае оставшиеся две цифры должны будут дать в сумме 20 или 19, что невозможно. С учётом код изменится так:
    for d1 in range(10):
        for d2 in range(10):
            for d3 in range(10):
                min_d4 = max(0, d1 + d2 + d3 - 18)
                max_d4 = min(9, d1 + d2 + d3)
                for d4 in range(min_d4, max_d4 + 1):
                    min_d5 = max(0, d1 + d2 + d3 - d4 - 9)
                    max_d5 = min(9, d1 + d2 + d3 - d4)
                    for d5 in range(min_d5, max_d5 + 1):
                        d6 = d1 + d2 + d3 - d4 - d5
                        if 0 <= d6 <= 9:
                            print(f'{d1}{d2}{d3}{d4}{d5}{d6}')
    Ответ написан
    Комментировать
  • Почему код не работает так как должен?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала, разность двух datetime даёт объект timedelta.
    И в доках написано так:
    Only days, seconds and microseconds are stored internally. Arguments are converted to those units:
    A millisecond is converted to 1000 microseconds.
    A minute is converted to 60 seconds.
    An hour is converted to 3600 seconds.
    A week is converted to 7 days.

    Т.е. timedelta(days=1).seconds даст 0, так как это 1 день и 0 секунд.

    Выхода два.
    1. Построй объект timedelta, описывающий таймаут операции, и сравнивай с ним напрямую.
    timeout = datettime.timedelta(days=1)
    if (datetime.datetime.now() - last_command_use_time) > timeout:
        ...

    2. Используй метод total_seconds()
    timeout = datettime.timedelta(days=1)
    if (datetime.datetime.now() - last_command_use_time).total_seconds() > 24*60*60:
        ...
    Ответ написан
    Комментировать
  • Что не так у меня в коде? Мне в терминале выводит большую ошибку.?

    Vindicar
    @Vindicar
    RTFM!
    Ну так читай внимательно текст ошибки.
    _tkinter.TclError: bad option "-tittle": must be -default, -detail, -icon, -message, -parent, -title, or -type

    Разницу видишь?
    А ошибка в строке
    File "c:\Users\Solo\Desktop\MAXIUMAM2035\Go_user.py", line 19, in button_click
    messagebox.showinfo(tittle='Проверка', message=info_str) # Для вывода информации
                        ^^^^^^
    Ответ написан
    1 комментарий
  • Не видит библиотеку discord, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    1. Не прикреплять код скриншотом. Правила принял не читая?
    2. У тебя в проекте вижу папку виртуального окружения venv. Куда библиотека поставлена: в venv, в системный интерпретатор, в системный но с наследованием в venv? Разберись, что такое виртуальное окружение и как оно работает.
    Ответ написан
    Комментировать
  • Почему с отрицательным кол-во хп персонаж жив?

    Vindicar
    @Vindicar
    RTFM!
    1. Включи логику. Ты сначала проверяешь, умер ли персонаж, а потом наносишь урон. Отсюда и наблюдаемое поведение.
    2. Никогда не используй f-строки для SQL запросов, освой parametrized queries.
    Ответ написан
    Комментировать
  • Почему не работает meber_join disnake?

    Vindicar
    @Vindicar
    RTFM!
    Разберись уже, как работает utils.get().
    Она принимает коллекцию объектов, и набор атрибутов в виде kwargs.
    Возвращает первый объект в этой коллекции, у которого атрибуты совпадают с заданными.
    Т.е. тебе надо туда передать список ролей сервера и атрибут id.
    Ну или использовать другой метод, например, member.guild.get_role().

    Читай документацию, короче.
    Ответ написан
    Комментировать
  • Как сделать рандом в дискорде?

    Vindicar
    @Vindicar
    RTFM!
    Изучай стандартную библиотеку языка, в частности, модуль random.
    Ответ написан
    Комментировать
  • IndentationError: unexpected unindent, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Почему ты открыл try, но не закрыл его блоком except или finally?
    Сначала учи язык, потом уже клепай ботов.
    Ответ написан
    Комментировать