Задать вопрос
Ответы пользователя по тегу Python
  • Это правильная реализация бинарного поиска?

    Vindicar
    @Vindicar
    RTFM!
    Твоя реализация зациклится, если такого элемента нет в списке.
    Ответ написан
    Комментировать
  • Как создать переменную к папке на компьютере?

    Vindicar
    @Vindicar
    RTFM!
    Ну "на любом компьютере" - это сильно сказано. Всё-таки на компе может быть и не windows.
    Но у тебя есть две опции.
    Во-первых, есть переменная окружения %APPDATA%, которая хранит как раз таки путь к AppData/Roaming для текущего пользователя. См. os.environ.
    Во-вторых, есть модуль win32com, который позволяет использовать модули COM для Windows, в т.ч. предоставляемые системой. Один из них занимается путями к стандартным папкам.
    from win32com.shell import shell, shellcon
    #путь к "мои документы". можно задавать разные константы CSIDL_XXX
    doc_folder = shell.SHGetFolderPath(0, shellcon.CSIDL_PERSONAL, None, 0)
    Ответ написан
    Комментировать
  • Как запускать python екзешники без консоли?

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

    Vindicar
    @Vindicar
    RTFM!
    По пользователю, от имени которого они выполняются (proc.username())?
    Либо по расположению исполняемого файла (proc.exe()).
    Смотря как ты определяешь "системный процесс".
    Ответ написан
    Комментировать
  • В чем разница конструкций?

    Vindicar
    @Vindicar
    RTFM!
    async def main():
        print(f"started at {time.strftime('%X')}")
        # вызов займёт 2 секунды, а не 3
        await asyncio.gather(say_after(1, 'hello'), say_after(2, 'world')) 
        print(f"finished at {time.strftime('%X')}")


    В синхронном коде такое можно имитировать только потоками.
    Ответ написан
    Комментировать
  • Как вывести по одному разу каждый символ который есть в строке?

    Vindicar
    @Vindicar
    RTFM!
    print(set(my_str))
    Ответ написан
    Комментировать
  • Расширение таблицы при парсинге?

    Vindicar
    @Vindicar
    RTFM!
    Если куски подгружаются динамически с помощью AJAX, то у тебя два выхода.
    а) выяснить, какой запрос нужно отправить на сервер, чтобы получить кусок таблицы, и выполнять именно этот запрос
    б) гонять полноценный браузер с помощью селениума
    Ответ написан
    Комментировать
  • Выдает ошибку list indices must be integers or slices, not str на 13 строке, в чем проблема?

    Vindicar
    @Vindicar
    RTFM!
    Ты очевидно что-то напутал со структурой данных res - на каком-то из уровней в ней список, а ты ожидаешь словарь с ключами-строками. Выведи эту структуру с помощью pprint, разберись, чем она отличается от твоих ожиданий, и поправь код обращения к res.
    Ответ написан
    Комментировать
  • Как записать в файл данные в заданном порядке?

    Vindicar
    @Vindicar
    RTFM!
    for m, k, z in zip(all_post, all_comments, all_undercom):
    Зачем тебе этот цикл, если ты ниже делаешь
    for k in all_comments:
    for z in all_undercom:

    У меня такое чувство, что ты не очень понимаешь, что делает функция zip.
    Ответ написан
    1 комментарий
  • Как вызвать self класса родителя?

    Vindicar
    @Vindicar
    RTFM!
    Неправильная терминология. Example - не родитель MyThread.
    Передайте ссылку на экземпляр Example (или на нужное поле) через параметр конструктора MyThread и сохраните её как экземплярную переменную класса MyThread. Но имейте ввиду - не факт, что вы сможете обратиться к элементам управления QT непосредственно из другого потока.
    Ответ написан
  • Что делать если телеграмбот который показывает погоду вылетает после неправильного введённого города?

    Vindicar
    @Vindicar
    RTFM!
    Скорее всего при неправильном городе вызов
    observation = mgr.weather_at_place(message.text)
    сгенерирует исключение. Судя по докам, это будет либо ParseResponseException либо APICallException. Если бы ты озаботился привести полное сообщение об ошибке, можно было бы сказать точно.
    В любом случае, читай про обработку исключений. Тебе нужно завернуть вызов в блок try, и если возникла ошибка - сообщить пользователю.

    Это я понимаю. Я не сам писал бота это ролик из ютуба.

    Если понимаешь, учи основы питона по-старинке - учебник и упражнения. По ютубу научишься только повторять, не понимая смысла. Сначала - основы, потом уже бросайся писать ботов.
    Ответ написан
    Комментировать
  • Как постоянно обновлять принт?

    Vindicar
    @Vindicar
    RTFM!
    Тут все предлагают system("cls"), хотя практичнее было бы использовать символ \x08.
    Простой пример, для понимания:
    print('foobar', flush=True, end='') #немедленный вывод без перевода строки
    print('\x08'*3, flush=True, end='') #отступаем на три символа назад
    print('xyz', flush=True, end='') #на экране будет выведено fooxyz

    Но этот приём работает только если:
    1. Данные выведены строго в одну строку, и курсор остаётся на ней.
    2. Известна длина затираемой части строки.
    3. Обновлять таким образом нужно только одно значение на экране.

    В противном случае либо используешь приём с cls, либо вообще плюёшь на терминал и делаешь GUI.
    Ответ написан
    Комментировать
  • Python/numpy: как увеличить массив на одну строку без использования дополнительной памяти?

    Vindicar
    @Vindicar
    RTFM!
    Нельзя. В этом и состоит отличие массива от списка. Список легче растянуть, чем массив, так как массив хранит все свои данные одним блоком, а список хранит одним блоком только ссылки на свои элементы.
    Нужно либо выделять массив с запасом, либо сбрасывать данные на диск для последующего чтения в numpy-массив.
    Ответ написан
    1 комментарий
  • Селениум. Использую find_elements и get_atribute, а как сделать одним запросом, чтобы без ошибки not attached?

    Vindicar
    @Vindicar
    RTFM!
    Насчёт not-attached - я подозреваю, ты не дождался, пока страница полностью прогрузится.
    А вообще в XPath есть выбор значения атрибута:
    //ul[@id="im_dialogs"]/li[contains(@class, "nim-dialog_unread ")]/@data-list-id

    Либо, возможно, так
    string(//ul[@id="im_dialogs"]/li[contains(@class, "nim-dialog_unread ")]/@data-list-id)

    Здесь string() - это не Python-функция, а XPath-функция. Если селениум её поддерживает, то запрос должен вернуть именно строковое значение атрибута.
    Ответ написан
  • Почему не выдаёт каждый раз новое прокси?

    Vindicar
    @Vindicar
    RTFM!
    Какая лютая жесть. Нахрена все эти преобразования из списка в строку и обратно?
    Я предполагаю, что в файле одна строка - это один прокси, и файл не настолько чудовищно велик, чтобы избегать его полной загрузки в память. Тогда если на пальцах:
    1. Описываешь функцию, которая разбирает строку в описание прокси (например, в кортеж "адрес,порт"). Например, если прокси указаны в виде адрес:порт, то подойдёт что-то типа
    @staticmethod
    def parse_proxy_line(line):
        # сработает, если на каждой строке указан порт
        addr, _, port = line.strip().rpartition(':')
        return (addr, int(port))

    2. В конструктор передаёшь коллекцию строк с прокси. Можно сделать что-то типа
    def __init__(self, source):
      self.proxies = list(map(parse_proxy_line, source))

    Учитывая, что текстовый файл - это тоже коллекция строк, можно просто передать открытый файл.
    with open('whatever.txt', 'rt') as src:
      proxy_list = ProxyList(src)

    После этого с файлом не работаешь - незачем.
    3. Создаёшь поле класса, в котором хранишь индекс следующего прокси для выдачи. Можно обойтись без этого индекса, если список не будет использоваться повторно - тогда можно просто отдавать нулевой элемент списка, и сразу же удалять его.
    4. Пишешь метод, который по запросу берёт элемент списка с указанным индексом, затем увеличивает индекс. Это повторяется, пока не найдётся рабочий прокси или пока индекс не выйдет за пределы списка.

    Всё! Кода на 15 строчек (с учётом проверки).

    А вообще можно обойтись и без класса.
    from typing import Tuple
    def parse_proxy_line(line: str) -> Tuple[str, int]:
        # сработает, если на каждой строке указан порт
        addr, _, port = line.strip().rpartition(':')
        return (addr, int(port))
    def is_good_proxy(proxy: Tuple[str, int]) -> bool:
        host, port = proxy
        return ... #тут проверяешь, хороший ли прокси и возвращаешь True если да
    
    src = open('proxies.txt', 'rt')
    # Это - ленивое вычисление. Когда мы запросим следующий прокси, 
    # filter() будет запрашивать элементы, пока не найдёт "хороший",
    # т.е. такой, для которого is_good_proxy() вернуло True
    # В свою очередь, эти элементы будут запрашиваться из map(), 
    # которая будет брать элементы из src и вызывать для каждого parse_proxy_line()
    # А элементы в файле src - это текстовые строки, которые будут читаться по запросу.
    # Таким образом, нет необходимости хранить весь список прокси в памяти, 
    # они будут подгружаться по мере возникновения потребности.
    proxies = iter(filter(is_good_proxy, map(parse_proxy_line, src)))
    
    #когда нужно получить ещё один прокси:
    host, port = next(proxies) #next - встроенная функция
    #если прокси закончились, выкинет исключение StopIteration, которое можешь поймать и обработать как хочешь.
    Ответ написан
    8 комментариев
  • Как правильно настроить многопоточность у бота telegram?

    Vindicar
    @Vindicar
    RTFM!
    Если коротко: пусть бот работает в главном потоке. ФЗ, синхронно или асинхронно, зависит от используемой библиотеки. Судя по приведённому коду, синхронно.
    А вот все длительные операции запускайте в отдельных потоках или даже процессах.
    Для общения между потоком бота и рабочими потоками/процессами организуйте две очереди. Из одной потоки обработки данных будут принимать задания. В другую они будут складывать сообщения для отправки (текст + id пользователя, например). Тогда основной бот должен по готовности запроса положить объект с описанием задания в первую очередь, а также периодически проверять наличие сообщений во второй. При наличии - извлекать и отправлять по назначению.
    Ответ написан
  • Написал на основе pydirectinput и pyqt5 простой антиафк, при нажатии кнопки запуск приложение вылетает, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Приложение просто не отвечает после нажатия кнопки 'Запуск'(функция start)

    Ну а что, логично. Читай как устроены оконные приложения, это же азы рабоыт с любым GUI.
    Если кратко, у них в основе цикл, который принимает сообщения от ОС (нажата клавиша, сдвинута мышь, и т.д.) и обрабатывает их.
    PyQT реализует этот цикл сам, ты имеешь дело только с обработчиками событий - но цикл от этого никуда не девается. Всё происходит в одном потоке, так что пока обработчик события работает - цикл стоит, следующие сообщения ждут очереди.
    Так что когда ты делаешь while self.gag==True:, твой обработчик никогда не выйдет из цикла while, никогда не передаст управление оконному циклу, и щелчок по кнопке end никогда не будет обработан (кк и любое другое событие).

    Что делать?
    а) start запускает второй поток, end его останавливает. Кури документацию к модулю threading.
    б) смотри, есть ли в PyQt способ запланировать вызов функции на следующей итерации оконного цикла/спустя некоторое время. В этом случае ты можешь раз за разом планировать вызов своей функции, которая реализует одну итерацию (гапример, шлёт одно нажатие кнопки). Поскольку её вызов будет выполняться средствами оконного цикла, а отрабатывать она будет быстро, это не помешает оконному циклу.
    Ответ написан
    1 комментарий
  • Как автоматически активировать мышку при запуске Windows?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри в сторону pywinauto. Он имитирует клики мышью по-другому, по идее должно работать.
    Ответ написан
  • Почему то ошибки в консоле нету, но и сообщение (123), не отправляться (aiogram)?

    Vindicar
    @Vindicar
    RTFM!
    test = False
    Ниже
    if test == True:
    async def prdfg(message: types.Message):
    У тебя prdfg не будет объявлено, так как на момент выполнения этой строки test всё ещё False.
    Ответ написан