Задать вопрос
Ответы пользователя по тегу Python
  • Почему не видит путь/экзешник?

    Vindicar
    @Vindicar
    RTFM!
    Юра Милевский, вынеси код ядра в отдельный поток (через threading) или в отдельный процесс (через multiprocessing). В главном потоке/процессе оставь GUI.
    Общение организуй через threading.Queue или multiprocessing.Queue (смотря что используешь).
    У тебя GUI задаёт только настройки ядра, ведь так? Тогда ты когда опльзователь что-то меняет в GUI, ты кладёшь в очередь кортеж вида ("имя параметра", "значение параметра"). Ядро в свободное время проверяет наличие новых элементов в Queue, извлекает эти кортежи, и запоминает новые настройки уже локально у себя (например, в словаре). Ну и использует этот словарь, когда потребуется.

    Если потребуется усложнить взаимодействие, то усложни структуру данных, которую передаешь. Например, кортеж будет иметь вид ("Имя команды", ["параметры", "команды"]). Ядро должно будет эту команду уже как-то интерпретировать и выполнить. Так или иначе, ключевая идея такая - передаёшь через очередь только примитивные типы вроде строк и чисел, а также кортежи, списки и словари.

    А если понадобится передать что-то от ядра в GUI, то используй отдельную очередь, которую GUI будет проверять, а ядро - наполнять.
    Ответ написан
  • Приветствую, пишу бота для дискорда на Python, не работает кик, в чем моя ошибка?

    Vindicar
    @Vindicar
    RTFM!
    lolikcheck09, кнопка </>

    Далее, я что-то не пойму с каким клиентом ты работаешь?
    Или ты работаешь с MyClient(), или ты работаешь с discord.ext.commands.Bot()?
    Потому что Bot() - это потомок Client(). Ты используешь его декоратор, т.е. опдписываешь свои функции на его события, но при этом не запускаешь bot, а запускаешь экземпляр MyClient().
    Ответ написан
  • Как реализовать выполнение процессов асинхронно?

    Vindicar
    @Vindicar
    RTFM!
    Ну если тебе нужна очередь, то asyncio.Queue в руки - или её эквивалент из threading, если решишь использовать потоки.
    Асинхронность поможет только если обработка элементов содержит большую долю ввода/вывода.
    Ответ написан
  • Как выполнять последовательную проверку данных в Google Seets?

    Vindicar
    @Vindicar
    RTFM!
    У меня получилось 4000 строк на 76 ключей

    Я надеюсь, вы знакомы с понятием цикла? o_O
    range='A3:A3',

    Просто генерируете значение range.
    for row in range(3, 130):
        values_guid = service.spreadsheets().values().get(
            spreadsheetId=spreadsheet_id,
            range=f'A{row}:A{row}',
            majorDimension='COLUMNS'
        ).execute()
        #ну и так далее

    Вместо цикла for по фиксированному диапазону можно сделать цикл while, и прерывать его когда наткнётесь на пустую ячейку. Тогда не придётся прописывать количество ячеек.
    Ответ написан
    3 комментария
  • Как на Python сделать скриншот рабочего стола?

    Vindicar
    @Vindicar
    RTFM!
    Ну технически это возможно, но проблематично.
    WinAPI позволяет получить скриншот окна с указанным дескриптором с помощью серии вызовов GetDC() -> CreateCompatibleDC() -> BitBlt(). Достучаться из Питона до винапи утомительно, но реально, пакет pywin32 в помощь.
    Проблема в том, что рабочий стол может состоять из более чем одного окна - например, фон может быть отдельно, а иконки - отдельно. Это зависит как минимум от версии Windows, и даже может меняться в рамках одной версии (на этом основан трюк, позволяющий поместить окно приложения ПОД иконками).
    Тебе придётся определить окна, принадлежащие рабочему столу, получить их дескрпиторы, сделать их скриншоты, а потом как-то свести их вместе.
    Ответ написан
  • Как подгрузить куки из json в запросы python?

    Vindicar
    @Vindicar
    RTFM!
    Зависит от используемой библиотеки. Ты про requests, что ли? Никогда не переводи названия.
    А вообще, как всегда, прочитай документацию. У методов .get()/.post() есть параметр cookies.
    Ответ написан
    4 комментария
  • Почему API возвращает 400?

    Vindicar
    @Vindicar
    RTFM!
    Использование параметра files подразумевает кодирование Multipart-encoded.
    Я подозреваю, нужно использовать параметр data вместо files в обращении к .post().
    Ответ написан
  • Верно ли, что атрибут класса перекрывает атрибут объекта?

    Vindicar
    @Vindicar
    RTFM!
    Возьми и проверь
    >>> class C:
    ...   x = 42
    ...   def __init__(self):
    ...     self.x = 13
    ...
    >>> i = C()
    >>> i.x
    13
    >>> C.x
    42
    >>>


    Что логично - объект сначала ищет атрибуты в своём __dict__, потом в __dict__ класса, потом идёт по предкам класса.
    Ответ написан
    Комментировать
  • Как исправить RuntimeWarning: coroutine was never awaited?

    Vindicar
    @Vindicar
    RTFM!
    self.pushButton.clicked.connect(self.working)
    А ты уверен, что обработчиком нажатия кнопки может быть корутина (async-функция)?
    По-моему, там должна быть обычная функция.
    Ответ написан
    Комментировать
  • Не читает код на пайтон, нет ошибок, но ничего не делает?

    Vindicar
    @Vindicar
    RTFM!
    У вас в def levenshtein(s1, s2): какая-то каша творится с отступами.
    Начиная с word1 = 'blog' код, похоже, должен быть вне функции, а вы его разместили почему-то внутри.
    Ответ написан
    Комментировать
  • Питон выдает 'missing 1 required positional argument: 'self'', что делать?

    Vindicar
    @Vindicar
    RTFM!
    threadBeginCard = Timer(0.1, beginCard, args=None, kwargs=None)

    Я без понятия, что такое Timer(), но могу догадаться, что он делает.
    Он вызывает beginCard() без позиционных (args) или именованных (kwargs) параметров по наступлению некоторого события.
    Проблема в том, что ты вызываешь метод класса, т.е. фактически Class.beginCard(). Ему нужно первым параметром передать экземпляр класса, т.е. self.
    Если бы ты вызывал метод экземпляра, т.е.
    c = Class()
    c.beginCard()
    То тогда self был бы подставлен автоматически.

    Вывод: создать Timer() внутри экземплярного метода, и передать ему self.beginClass в качестве функции. Обрати внимание на отсутствие скобок.

    Правда, я фз что произойдёт дальше - вызов join() мне не очень нравится, так как он заблокирует поток UI до момента завершения рабочего потока.
    Ответ написан
  • Почему одинаковый код выдает разные ответы?

    Vindicar
    @Vindicar
    RTFM!
    Ты пытаешься выполнить сетевые запросы. Время их выполнения зависит от очень многих факторов, в т.ч. от загруженности каналов связи между тобой и сервером, от политики кэширования, и т.д. Так что смотря какой ответ придёт раньше, может получить управление та или иная корутина.
    Ответ написан
    3 комментария
  • Проблема с MongoDB, поможете?

    Vindicar
    @Vindicar
    RTFM!
    Метод update() не подойдет?
    Ответ написан
    Комментировать
  • Как зациклить увеличение числа?

    Vindicar
    @Vindicar
    RTFM!
    Отвечу вопросом на вопрос: а зачем тебе наращивать число каждый час, если можно вместо этого запомнить, когда это число было изменено в последний раз? Тогда, когда число тебе потребуется, просто посчитаешь, сколько часов прошло с тех пор, и сколько должно быть сейчас. Это проще в исполнении и экономнее в плане ресурсов.
    А то цикл по всем пользователям, да ещё и периодически...
    Ответ написан
    Комментировать
  • Как сделать так чтобы в модуле JSON текст сохранялся в виде кириллицы?

    Vindicar
    @Vindicar
    RTFM!
    Как я уже писал в другом твоём вопросе, укажи параметр encoding='utf-8' при открытии файла.
    Ответ написан
    Комментировать
  • Почему не работает семафор?

    Vindicar
    @Vindicar
    RTFM!
    Потому что процесс обращения к серверу разбит на две части.
    Одна - установка соединения, SSL-рукопожатие, формирование и отправка запроса, а также редиректы. Это - get()
    Вторая - загрузка и декодирование тела ответа. Это - text().
    Ты прячешь под семафор только вторую часть, но вполне возможно, что она занимает пренебрежимо мало времени по сравнению с первой. К слову, если хочешь ограничить одновременнные подключения к серверу, то точно нужно прятать под семафор первую часть тоже.
    Ответ написан
  • Как работает асинхронность в пайтон?

    Vindicar
    @Vindicar
    RTFM!
    asyncio - это, скорее, как обойтись без многопоточности.
    Она хорошо работает для ситуаций, когда большая часть времени потока выполнения уходит на ожидание ввода-вывода - например, на ответ по сети. Если у тебя есть что-то, что занимает CPU, или любая другая операция, выполняемая вне рамок ввода-вывода через asyncio - это остановит выполнение асинхронной программы.
    Если на пальцах, то асинхронная программа состоит из отдельных корутин. Разница с потоками в том, что потоки переключает ОС, а корутины сами отдают управление, когда уходят в ожидание события (грубо говоря, когда делают вызов с await). Это упрощает синхронизацию корутин, так как ты точно знаешь, когда твоя корутина отдаст управление - меньше шансов налететь на состояние гонки из-за внезапного переключения. Опять же, переключение корутин куда более детерминировано, чем переключение потоков, так что "плавающие" баги встречаются реже.
    Тело асинхронной программы - это рабочий цикл (т.н. реактор, он же loop), который проверяет выполняемые операции ввода-вывода, и возобновляет выполнение корутины, когда её операция завершилась. Когда корутина завершится или запланирует ещё одну операцию, она вернёт управление в цикл. Вот почему "задумавшаяся" корутина остановит всю программу.
    Минус в том, что в отличие от многопоточности, нельзя просто вжжжжжжух и сделать код асинхронным. Он должен писаться как асинхронный с самого начала, с прицелом на исполнение в реакторе.
    Ответ написан
    2 комментария
  • Как в функцию передать фильтр, сработавшего хендлера?

    Vindicar
    @Vindicar
    RTFM!
    Ну наверно посмотрить, что доступно в параметре state?
    Ответ написан
    Комментировать
  • Как добавить возможность передавать коду другие файлы и каталоги прямо в командной строке?

    Vindicar
    @Vindicar
    RTFM!
    " Ещё одним возможным улучшением была бы возможность передавать сценарию другие файлы и каталоги прямо в командной строке. Эти имена можно получать из списка sys.argv и добавлять к нашему списку source при помощи метода extend класса list."

    Выделение моё.

    А вообще, sys.argv хранит список параметров командной строки. 0й всегда содержит путь и имя исполняемого скрипта, а вот последующие задаются пользователем.
    В простых случаях можете просто работать с sys.argv как со списком, но если у вас что-то более сложное (типа необязательных аргументов), то смотри в сторону argparse.
    Ответ написан
    Комментировать
  • Ошибка TypeError: sequence item 0: expected str instance, dict found что делать?

    Vindicar
    @Vindicar
    RTFM!
    MyFile = open('C:\HP\proverka.txt', 'w')
    MyFile.writelines(persones)
    MyFile.close()

    writelines() ожидает получить на вход массив СТРОК, а ты даёшь массив словарей. Отсюда и ошибка.
    Зачем ты вообще этот фрагмент написал, если чуть дальше у тебя нормальное сохранение в json?
    Ответ написан