Задать вопрос
  • Есть код на питоне как можно ускорить его мультипроцессность не работает?

    Vindicar
    @Vindicar
    RTFM!
    p = multiprocessing.Process(target=gen,args=(lst,))
    p.start()

    Ты запускаешь ровно один процесс, а потом стоишь и ждёшь (p.join()), когда он завершится. Это мало чем отличается от просто вызова gen() в твоём коде, безо всякого мультипроцессинга.
    Кроме того, у тебя функция gen() делает всю работу, а должна обрабатывать только один элемент. Ты думаешь Питон волшебным образом поймёт, что вот именно этот цикл надо распараллелить?

    Используй пул процессов multiprocessing.Pool, он принимает функцию и последовательность входных значений, а потом скармливает эти значения по одному в копии указанной функции в нескольких процессах, и собирает из них ответы.

    Пример есть в документации, если ты туда заглядывал. В примере показано несколько вариантов использования пула процессов.
    Я бы на твоём месте использовал или imap_unordered(), или imap(). Разница в том, что первый может не сохранять порядок - т.е. результаты тебе будут приходить не в том же порядке, в каком приходили данные во входной последовательности. Второй его сохраняет, но работает чуть медленнее (он ждёт, пока правильный порядок не получится).
    Ответ написан
    6 комментариев
  • Как превратить str в словарь (2 часть)?

    Vindicar
    @Vindicar
    RTFM!
    Сам словарь полученный от телеграмм мне нужно его в нужном моменте сохранять в бд, а позже вытаскивать обратно превращая назад в dict, но все идет по наклонной

    Ну т.е. как и предсказывали, проблема в более раннем коде.
    Когда сохраняешь в БД, делай не str(mydict), а json.dumps(mydict). Тогда можно будет делать json.loads() при загрузке.

    Только словарь надо будет почистить от постороннего, а ещё лучше - сначала сделать свой словарь ,в который сохранять ТОЛЬКО то, что тебе надо. Например, ты не заметил, что у тебя в словаре есть
    'entities': [<telebot.types.MessageEntity object at 0x7770137fd0>]

    Сюрприз-сюрприз, объект
    <telebot.types.MessageEntity object at 0x7770137fd0>
    явно сериализации не поддаётся, и ни сохранить, ни восстановить его не выйдет. Или убирать ключ entities, если он тебе не нужен, или разбираться, что это за объект и сериализовывать/восстанавливать его вручную.
    Ответ написан
    3 комментария
  • Не ищет картинку. Python?

    Vindicar
    @Vindicar
    RTFM!
    Ну правильно тебе питон говорит. У pyautogui нет функции loadImage(), ни в доках она ни упоминается, ни в исходниках. Откуда ты взял, что она есть?
    Ответ написан
    Комментировать
  • Не запускается бот в дискорд, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Всё, что начиная с
    @bot.event 
    async def on_ready():

    нужно подвинуть влево (уменьшить отступ). В питоне отступы значимы!
    Советую ненадолго отложить бота и поучить язык на более простых примерах, во избежание подобных ошибок.
    Ответ написан
    Комментировать
  • Есть ли для Python простые в использовании ORM с поддержкой asyncio и type hints?

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

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

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

    Vindicar
    @Vindicar
    RTFM!
    Лучше задайся вопросом, почему вообще у тебя str() от словаря?
    Веб-сервисы возвращают текст в формате json, который нужно декодировать через json.load() / json.loads().
    После декодирования ты получаешь собственно словарь, с которым можно работать.
    Короче, у тебя что-то напутано выше по коду, в том участке, который ты не показываешь. Покажи весь код.
    Ответ написан
    Комментировать
  • Как перебрать 5 или более списков в одном цикле?

    Vindicar
    @Vindicar
    RTFM!
    А как перебирать-то, чудо?
    Параллельно?

    list1 = list('abcdef')
    list2 = list('klmnop')
    list3 = list('uvwxyz')
    
    for item1, item2, item2 in zip(list1, list2, list3):
        print(item1, item2, item2)


    Последовательно?

    import itertools
    
    list1 = list('abcdef')
    list2 = list('klmnop')
    list3 = list('uvwxyz')
    
    for item in itertools.chain(list1, list2, list3):
        print(item)


    Во всех сочетаниях?

    import itertools
    
    list1 = list('abcdef')
    list2 = list('klmnop')
    list3 = list('uvwxyz')
    
    for item1, item2, item3 in itertools.product(list1, list2, list3):
        print(item1, item2, item3)

    Ответ написан
    Комментировать
  • Как я могу запустить скрипт в Pycharm, используя CMD?

    Vindicar
    @Vindicar
    RTFM!
    В общем, по итогам обсуждения:
    Я бы разобрался, как работает venv. Pycharm всё-таки очень жоркая штука, не надо его использовать просто как среду выполнения. Вообще, ЕМНИП, достаточно вызвать python.exe, который лежит внутри окружения проекта. Что-то типа
    cd C:\my_project\
    .venv\bin\python3.exe main.py

    Если этого мало - разбирайся со скриптом activate.
    Шрифт и цвет терминала тоже поддаётся настройке, если что.

    Но если прям невтерпёж удалить гланды через задницу
    Найди способ послать в PyCharm сочетание Ctrl-Shift-F10, оно запускает текущий файл. Это можно сделать через тот же питон (модули типа pywinauto или pyautogui), или используя стороннее ПО типа AutoHotkey.
    Ответ написан
    1 комментарий
  • Как создать ярлык в python?

    Vindicar
    @Vindicar
    RTFM!
    Лучше через реестр добавляй, в
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
    . Эта ветка должна быть открыта на доступ пользователю. Как работать с реестром из-под питона - гугли.
    Ответ написан
  • Возможно ли раздать Wi-Fi через спутник?

    Vindicar
    @Vindicar
    RTFM!
    Передавать-то на Wi-Fi частоте ты может и сможешь... а вот как телефон спутнику отвечать будет? Антенну и батарейки придётся в рюкзаке носить. =)
    Ответ написан
    1 комментарий
  • Как правильно реализовать очередь?

    Vindicar
    @Vindicar
    RTFM!
    Я вижу в тегах aiohttp, так что предполагаю, что код у тебя асинхронный.
    Мне тут как-то доводилось отвечать на подобный вопрос, может, и тебе пригодится...
    Идея простая - ты держишь долгоиграющую задачу, которая мониторит очередь запросов, и выбирает запросы из очереди один за другим. При этом каждый элемент очереди содержит future, в которое будет помещен результат работы корутины, и которое получает код, обратившийся к ресурсу.
    Я попробовал оформить это в виде декоратора, который автоматически троттлит обращения к функции. Возможно, код неоптимален, и его придётся допилить.
    Код

    import typing
    import asyncio
    import functools
    
    
    def throttled(delay: float, measure: typing.Literal['end_to_start', 'start_to_start'] = 'start_to_start'):
        def decorator(actual_func: typing.Coroutine) -> typing.Coroutine:
            queue = None
            task = None
            
            async def _single_query(future, args, kwargs):
                try:
                    result = await actual_func(*args, **kwargs)  # тут делаем асинхронное обращение к сервису
                except BaseException as err:
                    future.set_exception(err)  # была ошибка - теперь await future выкинет исключение
                else:
                    future.set_result(result)  # полуен результат - await future вернёт его
            
            async def _work_loop():
                nonlocal queue
                nonlocal task
                while True:
                    try:
                        # ждем, пока не придёт запрос, или пока не закончится таймаут
                        future, args, kwargs = await asyncio.wait_for(queue.get(), delay)
                    except asyncio.TimeoutError:  # новые запросы долго не приходят, сворачиваем работу, чтобы не тратить ресурсы
                        queue = None
                        task = None
                        return
                    single_task = _single_query(future, args, kwargs)
                    if measure == 'start_to_start':
                        asyncio.create_task(single_task)
                    else:
                        await single_task
                    queue.task_done()  # каждому успешному get() соответствует task_done()
                    await asyncio.sleep(delay)
            
            @functools.wraps(actual_func)
            async def query(*args, **kwargs):
                nonlocal queue  # обращение к переменной выше уровнем, но не глобальной
                nonlocal task
                future = asyncio.Future()  # Future просигналит, когда наш запрос будет обслужен
                if task is None:  # либо это первый запрос, либо запросы долго не приходили, и мы свернули работу
                    queue = asyncio.Queue()
                    task = asyncio.create_task(_work_loop())
                await queue.put((future, args, kwargs))
                return await future
            
            return query
        
        return decorator



    Пример использования:
    # delay - минимальный интервал между запросами в секундах
    # measure - как мерять интервалы между запросами: начало-начало или конец-начало
    @throttled(delay=5.0, measure='start_to_start')
    async def my_coroutine(*args, **kwargs) -> ReturnValue:
        ...

    При этом если задекорировать несколько функций, каждая из них будет иметь свою очередь задач.
    Минус - задача мониторинга будет висеть некоторое время после последнего запроса. А именно, пока таймаут между запросами не истечет.
    Ответ написан
    3 комментария
  • Почему энтри объект игнорирует запросы?

    Vindicar
    @Vindicar
    RTFM!
    зашитая в кнопку команда объектом энтри игнорируется

    Ты в обработчике кнопки сам создаёшь новый экземпляр класса Put_Entry (который является виджетом), нигде его не размещаешь, а просто что-то с ним делаешь. Конечно, уже существующие экземпляры от этого никак не изменяются - твоя кнопка про них ничего не знает и никак их не трогает.

    Короче, читай учебник, для начала. У тебя, похоже, полнейшая каша в голове. Разбирайся в понятиях области видимости и времени жизни, для начала - тогда будет понятнее, что где хранить и что куда передавать.
    Не говоря уже о том, что я тебе уже два раза показывал, как хоть немного правильно создавать свои UI-классы, но как об стенку горох.
    Ответ написан
    4 комментария
  • Данные из буфера не обновляются, что сделать?

    Vindicar
    @Vindicar
    RTFM!
    Сейчас код сначала получает текст, содержащий координаты точек из буфера обмена, потом разбирает и проверяет каждую строку и переспрашивает нужна ли она, а потом уже входит в цикл while True, где он их прокликивает и ожидает нажатия w или q.
    Нужно всю ту часть, где определяются координаты, а также сам код прокликивания внести внутрь ветки w.

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

    Vindicar
    @Vindicar
    RTFM!
    В hex один байт - всегда два символа. Я бы сделал byte_list = hex_string.split(':'), тогда можно будет прочитать i-й байт как int(byte_list[i], 16)
    Ответ написан
  • Как реализовать перенос строки MarkdownV2?

    Vindicar
    @Vindicar
    RTFM!
    https://www.markdownguide.org/basic-syntax/#line-breaks
    To create a line break or new line (<br>), end a line with two or more spaces, and then type return.

    Попробуй два пробела перед переносом строки, т.е. ' \n'
    Ответ написан
    Комментировать
  • Как выйти из цикла в другой функции?

    Vindicar
    @Vindicar
    RTFM!
    Никак*. Осознай, что операторы выполняются последовательно. Пока start_stop(True) не закончит выполнение, time.sleep() даже не начнёт выполняться, не говоря уже о последующем. А start_stop(True) не закончит выполнение никогда, потому что ты сделал вечный цикл.

    Также меня несколько настораживает поставленный тобой тег aiogram, потому что использование time.sleep() в асинхронных приложениях - плохая идея. Это наводит на мысль, что тебе стоит сначала понять как следует работу асинхронных приложений. Вот одиндругой) из моих старых ответов, может поможет начать.
    *

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

    Vindicar
    @Vindicar
    RTFM!
    Создай через create_task() долго работающую задачу, которая будет периодически опрашивать запланированные расссылки, искать те, которые "уже пора" и запускать их на выполнение. А потом спать некоторое время до очередной проверки. Эта задача должна стартовать параллельно с ботом.
    Такой способ может вносить погрешность в точное время рассылки (условно, проверяешь раз в час - время можно задать только с точностью до часа). Но зато он гораздо менее рискован. Упрощённо, если ты сделал await asyncio.sleep(сколько_нужно), а за это время бот упал и был перезапущен, бот просто не "вспомнит" о ранее запланированных, но не выполненных рассылках.
    Ответ написан
    Комментировать