Ответы пользователя по тегу Python
  • Как вычитать от даты 2 дня ( дата вида строки)?

    Vindicar
    @Vindicar
    RTFM!
    Храни в БД Unix timestamp (количество секунд от начала эпохи). Оно компактнее, и операции сравнения и плюс/минус интервал делать куда как проще.
    Ну и питон позволяет получить дату/время в виде timestamp, и преобразовать обратно.
    Ответ написан
  • Почему не выводит python в командной строке?

    Vindicar
    @Vindicar
    RTFM!
    Галку py launcher (ассоциировать с файлами .py) не забыл?
    Ответ написан
  • Как грамотнее написать скрипт для обновления данных по таймеру?

    Vindicar
    @Vindicar
    RTFM!
    async def long_task():
        while True:
            await do_stuff()
            await asyncio.sleep(3600) # если нужна простая периодичность
    
    # для запуска
    task = asyncio.get_running_loop().create_task(long_task())
    # для останова
    task.cancel()  #выкинет спец. исключение в long_task(), так что finally отработает
    Ответ написан
    4 комментария
  • Как перезагрузить модуль с помощью строчного названия?

    Vindicar
    @Vindicar
    RTFM!
    1. sys.modules
    This is a dictionary that maps module names to modules which have already been loaded. This can be manipulated to force reloading of modules and other tricks.

    2. Ещё может пригодиться importlib.invalidate_caches()
    This function should be called if any modules are created/installed while your program is running to guarantee all finders will notice the new module’s existence.
    Ответ написан
    Комментировать
  • Как на питоне проверить наличие строки в массиве из файла?

    Vindicar
    @Vindicar
    RTFM!
    Ну так почему бы не поискать, как обрезать пробелы и как применить функцию ко всем элементами массива в питоне? Там есть эквиваленты и array_map() и trim().
    Ответ написан
    Комментировать
  • Как возвращать промежуточный результат?

    Vindicar
    @Vindicar
    RTFM!
    Перепишите скрипт A так, чтобы он позволял сообщать сведения о прогрессе иначе. Упрощенный пример:

    Было:
    import time
    
    for i in range(100):
        time.sleep(1)
        print($"{i}%")


    Стало:
    import time
    
    def run_script(on_progress):
        for i in range(100):
            time.sleep(1)
            on_progress(i)
    
    if __name__ == '__main__':
        run_script(lambda i: print($"{i}%"))


    Тогда в другом скрипте будет:
    from script_a import run_script
    
    def my_progress(i):
        pass # показываешь прогресс скрипта
    
    run_script(my_progress)


    Пример очень упрощённый, если скрипт выдаёт несколько видов информации, то либо on_progress будет иметь несколько параметров, либо потребуется несколько таких функций.
    Ответ написан
    1 комментарий
  • Как сохранить значение переменной после перезапуска кода?

    Vindicar
    @Vindicar
    RTFM!
    Не присваивай переменной значение прописанное прямо в коде, а читай его из файла. Если переменная и впрямь одна и она примитивная (число/строка) - можно просто из файла, если их несколько - нужна структура и модуль json, если их много - впору задуматься о БД.
    Ответ написан
    Комментировать
  • Как накладывать изображения в python?

    Vindicar
    @Vindicar
    RTFM!
    Т.е. если переформулировать вопрос:
    Есть два изображения (A и B) с одинаковым набором маркеров. Нужно трансформировать изображение B так, чтобы его маркеры совпали по положению с маркерами изображения A, а потом наложить результат на изображение A.
    Я так понял?

    Если да, то это делается примерно так.
    1. Формируешь два массива координат - маркеры на изображениях A и B. Как - зависит от типа маркеров, но порядок должен быть одинаковым в обоих массивах. Форма (shape) массивов должна быть (N, 1, 2), где последний индекс отвечает за x или y координату, а N - число маркеров.
    2. Вызываешь
    homography, ptmask = cv2.findHomography(arrayB, arrayA, cv2.RANSAC)
    .
    homography будет матрицей проективного преобразования - как повернуть маркеры B, чтобы они легли на маркеры A. ptmask будет содержать сведения о том, какие пары точек удалось совместить.
    3. Делаешь вызов cv2.warpPerspective(), чтобы повернуть изображение B согласно матрице homography. Параметр размера должен быть таким чтобы второе изображение точно уместилось вместе с первым. Например, можно заранее создать большое изображение по размеру.
    4. Делаешь совмещение. Используешь cv2.PerspectiveTransform(), чтобы понять, где на итоговом изображении будут углы изображения B, делаешь cv2.fillPoly() чтобы создать бинарную маску для наложения. В маске белый пиксель будет означать "сюда поместить пиксель из повернутого B", а черный - "оставить пиксель как есть". Используешь эту маску, чтобы выполнить наложение.

    Пример кода и исходных данных - не совсем то, что тебе нужно, но идею передаст, я надеюсь.
    Ответ написан
  • Tkinter grid, как растянуть сетку на все окно?

    Vindicar
    @Vindicar
    RTFM!
    Адаптивность решается через rowconfigure() и columnconfigure().
    А вот сам вопрос кривой: тебе нужно окно на весь экран, или только виджет на всё окно? Это разные вещи, как бы.

    Если нужно растянуть один виджет на всё окно (root), то просто
    widget.pack(fill='both', expand=True)
    Ответ написан
  • Как получить html страницы,который не активен через запросы?

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

    Vindicar
    @Vindicar
    RTFM!
    У тебя внутренний цикл while разбивает одно число. Перед этим циклом создай новый список, и закидывай числа туда, а не в X. После while закидывай этот список в X.
    Ответ написан
    1 комментарий
  • Как решить данную проблему с SQLite?

    Vindicar
    @Vindicar
    RTFM!
    for row in result:
        singup = str(row[0])

    Молчаливо подразумевает, что в result будет хотя бы одна строка. Это далеко не факт.
    Если result пуст, то singup не будет присвоено значение.
    Ответ написан
    Комментировать
  • Как достать значение ключа из словаря?

    Vindicar
    @Vindicar
    RTFM!
    Вообще очень странная конструкция. Если ключи верхнего уровня гарантированно уникальны, проще будет сделать так:
    my_lst = [ ... тут твой список ... ]
    my_dct = {}
    for item in my_lst:
        my_dct.update(item)

    И тогда можно будет просто оперировать my_dct.keys(). Например,
    keys = list(map(int, my_dct.keys()))
    print(f"{min(keys)}...{max(keys)}")
    Ответ написан
    1 комментарий
  • Как удалить временные файлы?

    Vindicar
    @Vindicar
    RTFM!
    Используй модуль tempfile, он умеет прибирать за собой. Но это лучше всего работает, если тебе нужен именно файловый объект, а не именованный файл в файловой системе. Есть, конечно, класс tempfile.NamedTempFile, но там свои заморочки.
    Ответ написан
    Комментировать
  • UnboundLocalError: local variable referenced before assignment что делать?

    Vindicar
    @Vindicar
    RTFM!
    Если цикл for block in soup.find_all не выполнится ни разу (например, нет подходящих элементов), то task_stack не будет присвоено значение. А ты дальше его читаешь.
    Предусмотри какое-то значение по умолчанию для этой переменной, и проверяй такой случай.
    Ответ написан
    Комментировать
  • Нажимаю на кнопку она не работает, при этом схема собрана правильно, Что не так с кодом?

    Vindicar
    @Vindicar
    RTFM!
    Проверь документацию, может, номер пина не тот? Номер бита в регистре цифрового ввода вывода - это не то же самое, что номер пина на плате.
    И я без понятия, какую нумерацию использует питоновская обертка. Но судя по отсутствию указания модели платы в коде, вряд ли номер пина на плате...
    Ответ написан
    Комментировать
  • Как реализовать систему изменения данных в базе данных?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, если ты используешь aiogram, то про многопоточность лучше забыть. Асинхронность с многопоточностью сочетается довольно плохо. Это возможно, но нетривиально, и новичкам лучше не связываться.
    Во-вторых, дай угадаю - задержку в цикле фарминга реализуешь через time.sleep()? Если да, то конечно, цикл асинхронной программы останавливается на это время. Вот почему предусмотрена функция asyncio.sleep(), которая может приостановить выполнение отдельной корутины, не трогая остальных.
    В-третьих, если тебе нужно выполнить корутину и дождаться результата её выполнения - используй оператор await. Если же тебе нужно запланировать выполнение корутины и идти дальше, не дожидаясь её результата (выполнение "как только, так сразу") - лучше использовать asyncio.get_event_loop().create_task().

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

    Vindicar
    @Vindicar
    RTFM!
    Ну так-то модуль ctypes в помощь, но ты сначала научись выражать свои мысли...
    вызвать переменную, которая вернется как integer = 0?
    Ответ написан
    Комментировать
  • Что делает "..." в Python?

    Vindicar
    @Vindicar
    RTFM!
    Вообще обычно это заглушка. Но это уникальное значение (как None), и его можно использовать для своих целей, при желании.
    Например, в numpy он используется так: если у нас есть массив с 3 измерениями, и мы хотим задать срез по третьему измерению, мы можем записать либо так array[:, :, 0] либо так array[..., 0].
    По-моему, еще в typing есть применения.
    Ответ написан
    Комментировать
  • Как выводить сообщение без остановки?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых ты творишь какой-то колхоз. discord.py тащит как зависимость асинхронную aiohttp, а ты сначала используешь синхронный requests, а потом заворачиваешь его в асинхрон через ThreadPool, потом обратно заворачиваешь в синхронный код в main(), а потом этот main() хочешь использовать вместе с асинхронным кодом discord.py. Жесть.
    Вот не проще осилить изначально асинхронную библиотеку, которую и так и так придётся использовать?

    Далее, что за бредятина с while? Что, по-твоему, должен делать вызов on_ready() в цикле? Что еще за точки с запятыми в питоне?
    Ты делаешь чисто синхронный бесконечный цикл, естественно этот цикл не даёт асинхронному коду исполняться.

    Ну и до кучи зачем-то используешь discord.Client вместо discord.Bot.

    Даже базового знания того, как работает асинхронность в питоне, достаточно, чтобы набросать код вида:
    import asyncio
    import aiohttp
    import discord
    from discord.ext import commands
    client = commands.Bot(intents = discord.Intents.default())
    
    async def fetch():
        return ... # тут вытаскиваем данные с сайта через aiohttp и возвращаем в удобном нам виде
    
    async def display(results):
        global client
        pass  # тут выводишь результаты в дискорд, используя объект client
    
    async def cycle():
        while True:
            res = await fetch()  # обработку ошибок допиши сам
            await display(res)
            await asyncio.sleep(300)  # задержка в секундах
    
    cycle_task = None
    @client.ready
    async def on_ready():
        global cycle_task
        if cycle_task is None:  # событие ready может отрабатывать несколько раз, нам нужен только один.
            cycle_task = asyncio.get_event_loop().create_task(cycle())
        pass  # тут делаешь что тебе еще нужно по запуску бота
    
    # когда надо будет остановить цикл, вызови cycle_task.cancel()
    bot.run(TOKEN)  # запускаешь бота
    Ответ написан
    Комментировать