Ответы пользователя по тегу Python
  • Взаимосвязь Python с программами?

    Vindicar
    @Vindicar
    RTFM!
    Под наивным "взаимосвязь" скрывается несколько совершенно различных технологий.
    Пакеты pyautogui и pywinauto занимаются вопросами имитации пользовательского ввода (и вообще взаимодействия с интерфейсом программы).
    Если тебе нужно лезть в чужую память - то тут уже нужно использовать win32 API функции ReadProcessMemory()/WriteProcessMemory(). Модуль ctypes в помощь.
    Если тебе нужно лезть в трафик чужого приложения, есть такая штука как dpkt.

    Фокус в том, что ни один из этих инструментов не тривиален в использовании. Нужно хорошо представлять устройство памяти процесса в windows, устройство оконного интерфейса в windows или устройство сетевых протоколов, в зависимости от задачи. А это дело не одного месяца.
    Ответ написан
    4 комментария
  • Как в Python вывести таблицу как в примере?

    Vindicar
    @Vindicar
    RTFM!
    Вывести в консоль?
    Ну я бы подходил к этому так.
    1. Преобразовать все выводимые данные в строки и разбить их по переносам строки.
    2. Определить наибольшую ширину каждого столбца с учётом переносов строки. Для каждой ячейки вычисляем наибольшую ширину строки, потом ищем максимум по столбцу. Можно добавить 1-2 символа как "поля", если надо.
    3. При выводе строки, выводим строки ячеек вместе, используя itertools.zip_longest(). Т.е. сначала первую строку в каждой ячейке, потом вторую, и т.д. Если получили вместо одной из строк None, значит в этой ячейке строки уже закончились - выводим пробелы.
    Ширину вывода каждой ячейки мы знаем из пункта 2, выровнять значение пробелами - тривиально.

    # -*- coding: utf-8 -*-
    import typing as t
    import itertools
    
    def print_table(headers: t.Dict[str, str], data: t.Iterable[t.Dict[str, str]]) -> None:
        keys: t.List[str] = list(headers.keys()) #список ключей в таблице - чтобы сохранять порядок столбцов
        split_data: t.List[t.Dict[str, t.List[str]]] = [] #ячейки, разбитые на строки
        max_widths: t.Dict[str, int] = { key:len(value) for key,value in headers.items() } #ширина каждого столбца в таблице
        for line in data:
            #разбиваем ячейки строки на текстовые строки по \n
            split_line: t.Dict[str, t.List[str]] = { key:value.splitlines() for key,value in line.items() }
            #обновляем ширину столбцов, если надо
            for key in keys:
                new_width = max(map(len, split_line.get(key, [''])))
                if new_width > max_widths[key]:
                    max_widths[key] = new_width
            split_data.append(split_line)
        #выводим заголовки
        for key in keys:
            print(f'{{0:<{max_widths[key]}}}'.format(headers[key]), end='|') #можно вместо | поставить пробел
        print()
        print( '+'.join('-'*v for v in max_widths.values()) + '|') #разделитель заголовка и тела таблицы
        #выводим строки таблицы
        for row in split_data:
            for parts in itertools.zip_longest(*(row[key] for key in keys)):
                #parts - кортеж, где каждый элемент либо строка в очередной ячейке, либо None
                for key,part in zip(keys, parts):
                    #None означает, что в этой ячейке строки текста уже кончились
                    print(f'{{0:<{max_widths[key]}}}'.format(part if part is not None else ''), end='|')
                print()
            print( '+'.join('-'*v for v in max_widths.values())  + '|') #разделитель строк, если надо
    
    data = [
        {'ip':'192.168.0.2', 'model':'DES-3200-26', 'uptime': '3d 12:03:05', 'uplink state': '25: up\n26:up', 'uplink err': '0\n11', 'uplink mcast': '24560\n113'},
        {'ip':'192.168.0.2', 'model':'DES-3200-52', 'uptime': '1d 04:00:15', 'uplink state': '49: up\n50:up\n51:down\n52:down', 'uplink err': '10\n1133\n0\n0', 'uplink mcast': '5497812\n3145\n0\n0'},
    ]
    headers = {'ip': 'IP address', 'model': 'Model', 'uptime': 'Uptime', 'uplink state': 'Uplink state', 'uplink err': 'Uplink errors', 'uplink mcast': 'Uplink M-cast'}
    print_table(headers, data)

    IP address |Model      |Uptime     |Uplink state|Uplink errors|Uplink M-cast|
    -----------+-----------+-----------+------------+-------------+-------------|
    192.168.0.2|DES-3200-26|3d 12:03:05|25: up      |0            |24560        |
               |           |           |26:up       |11           |113          |
    -----------+-----------+-----------+------------+-------------+-------------|
    192.168.0.2|DES-3200-52|1d 04:00:15|49: up      |10           |5497812      |
               |           |           |50:up       |1133         |3145         |
               |           |           |51:down     |0            |0            |
               |           |           |52:down     |0            |0            |
    -----------+-----------+-----------+------------+-------------+-------------|
    Ответ написан
    2 комментария
  • Почему Python такой, как им пользуются?

    Vindicar
    @Vindicar
    RTFM!
    Например, чтобы запустить написанный код на другом пк нужно притащить туда интерпретатор python, накатить все библиотеки которые используются в моем творении и запустить скрипт, и будет все это крутиться в консоли.

    1. Правильно, если нужен именно упакованный exe, используется PyInstaller, хотя это и не очень оптимально.
    2. Файлы с расширением .pyw запускаются без окна консоли (на Windows). На Linux системах есть свои средства подавления окна консоли.
    3. Чтобы запустить программу на .NET, нужно, чтобы была установлена правильная версия .NET Framework. Чтобы запустить программу, скомпилированную на C++ с помощью Visual Studio, под виндой обычно требуется MSVC Redistributable правильной версии. Они могут быть предустановлены, но это не факт. Так что вопрос зависимостей есть не только в питоне. Питон хотя бы имеет пакетный менеджер для таких вещей, и в большинстве случаев установка зависимостей сводится как pip install foo bar baz.
    А как им пользуются, запускают код, он "крутиться" что то там делает или вызывают питоновские скрипты из других языков.

    Как правило, самостоятельно, в виртуальном окружении типа venv или docker. Если скрипту не требуются специфичные зависимости, можно использовать интерпретатор питона, установленный прямо в системе.
    Но есть механизмы, позволяющие программе на C++ встраивать в себя интерпретатор питона - тогда можно использовать питон для написания скриптов для автоматизации этой программы, например. Это используется реже.
    Ответ написан
    Комментировать
  • Как результат каждого процесса записать в отдельный соответствующий файл (Multiprocessing, Python)?

    Vindicar
    @Vindicar
    RTFM!
    for i,item in enumerate(data_group):
        file_name = f"{i}.txt"
        #ну и далее по тексту

    Как-то так? Я серьёзно не вижу в чём затруднение.
    Ответ написан
    Комментировать
  • Как sys.stdin, который выглядит как словарь превратить в словарь?

    Vindicar
    @Vindicar
    RTFM!
    Ты пробовал вывести str(sys.stdin) на экран?
    >>> str(sys.stdin)
    "<_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8'>"


    sys.stdin - это файл, открытый в текстовом режиме. Работай с ним как с файлом.
    Ответ написан
    1 комментарий
  • Вход на сайт и парсинг данных, как реализовать?

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

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

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

    Vindicar
    @Vindicar
    RTFM!
    1. itertools.permutations(), itertools.products(), itertools.combinations_with_replacement(). Выбери, какое поведение тебе нужнее, они немного отличаются.
    2. таких комбинаций будет ОЧЕНЬ много - вплоть до 2^N, где N - длина исходной строки. Чтобы представил, 16 букв (именно букв) дадут 65536 комбинаций. Оно тебе точно надо?
    Ответ написан
    2 комментария
  • Как из класса из функции, перетащить значение в другой класс в функцию?

    Vindicar
    @Vindicar
    RTFM!
    Проще всего вынести переменные из локальных в экземпляр класса. А потом дописать второму классу конструктор, и передавать ссылку на первый класс. Но чтобы избежать состояний гонки (когда два потока лезут в одну переменную, и хотя бы один из них - на запись), нужно спрятать переменные dej1 и dej2 под мьютекс(в терминах питона - Lock).
    class search_time(Thread):
      def __init__(self):
        super().__init__()
        self.dej = ""
        self.dej2 = ""
        self.dej_mutex = threading.Lock()
      def run(self):
        #в коде run запись в self.dej1 или self.dej2 делается строго так
        if self.dej_mutex.acquire(): #если Lock уже занят вторым потоком, первый подождёт освобождения
          self.dej1 = "Вася Пупкин"
          self.dej2 = "Жора Золотарёв"
          self.dej_mutex.release() #а теперь сами освободим Lock, чтобы второй поток мог обратиться к переменным

    Во втором потоке создаёшь конструктор, и передаёшь ему ссылку на первый поток.
    class runbot(Thread):
      def __init__(self, st):
        super().__init__()
        self.st = st
      def run(self):
        #в коде обращение к dej1 или dej2 делается строго так
        if self.st.dej_mutex.acquire(): #если Lock сейчас занят первым потоком, ждём освобождения
          print(self.st.dej1, self.st.dej2) #используем переменные
          self.st.dej_mutex.release() #а теперь сами освободим Lock, чтобы первый поток мог обратиться к переменным


    Тогда при создании потоков сделаешь так:
    w1 = search_time()
    w1.start()
    w2 = runbot(w1)
    w2.start()
    Ответ написан
    2 комментария
  • Задача на pyhton. Как разобрать формулу?

    Vindicar
    @Vindicar
    RTFM!
    nihi1ist, это знак суммы. Читай, эта запись эквивалентна такому:
    sum = 0
    for n in range(0, X): #X - то что над знаком суммы
        V = ... #выражение, зависящее от n - то что справа от знака суммы
        sum += v

    Ну разумеется, до бесконечности цикл прокрутить не получится, и тут в дело вступает точность.
    Тебе нужно вычислить очередное слагаемое в сумме, и если оно по модулю меньше точности, то цикл нужно прервать. Иначе добавить слагаемое к сумме, увеличить n и продолжить цикл.
    Ответ написан
    Комментировать
  • Почему PostdgreSQL постоянно выдает ошибку AttributeError: 'NoneType' object has no attribute 'fetchall'?

    Vindicar
    @Vindicar
    RTFM!
    Я полагаю, есть два способа сигнализации о пустом ответе, и разные движки используют разные подходы.
    Либо БД может вернуть объект-курсор, который не содержит ни одной строки.
    Либо БД может вернуть None.

    Для понятности такая аналогия: пусть нам возвращают список. Если нам всегда возвращают список, то можем писать код так:
    for line in db.query("..."):
        do_something(line)

    Сработает даже еслди в ответе нет ни одной строки, т.е. на пустом списке.
    А вот если нам при пустом ответе возвращают None, то код выше вылетит с ошибкой NoneType is not iterable, и надо будет переписать так:
    result = db.query("...")
    if result is not None:
        for line in result:
            do_something(line)
    Ответ написан
    1 комментарий
  • Как исправить ошибку IndexError: list index out of range?

    Vindicar
    @Vindicar
    RTFM!
    У тебя в списке ничего нет, я полагаю. Такое будет, если файл существует, но он пуст.
    Ответ написан
  • Можно ли вызвать из потока асинхронный метод или передать в поток асинхронный метод?

    Vindicar
    @Vindicar
    RTFM!
    Сделай свою программу асинхронной. Асинхронным методам для выполнения требуется работающий цикл-реактор (loop в терминологии asyncio). Этот цикл занимает поток, и все асинхронные корутины выполняются в этом потоке. Без него ничего не выйдет.
    Гипотетически можно запустить такой цикл в отдельном потоке и держать асинхронный код там. Но честно, лучше попробовать сделать свою программу асинхронной, если это возможно (т.е. если нет конфликтующих вечных циклов, как в GUI).
    Ответ написан
    Комментировать
  • Как отфильтровать список по заданному условию?

    Vindicar
    @Vindicar
    RTFM!
    langs = ['en-us', 'en-mc', 'en-gb', 'en-im', 'en-je', 'en-vg', 'en-ie', 'en-lu', 'sv-se', 'en-by', 'en-md', 'en-al', 'en-xk', 'en-me', 'fr-fr', 'fr-bl', 'fr-ch', 'es-es', 'it-it', 'it-sm', 'pt-pt', 'de-de', 'de-at', 'de-li', 'de-ch', 'nl-nl', 'nl-be', 'en-no', 'en-sj', 'en-fi', 'en-ax', 'en-dk', 'en-gl', 'en-is', 'ru-ru', 'pl-pl', 'bg-bg', 'cs-cz', 'el-gr', 'hu-hu', 'lt-lt', 'ro-ro', 'sk-sk', 'uk-ua', 'en-lv', 'en-rs', 'en-si', 'en-ba', 'en-cy', 'en-ee', 'en-hr', 'en-mk', 'en-mt', 'en-ph', 'en-mm', 'en-kh', 'en-mn', 'en-kz', 'en-la', 'en-za', 'en-ck', 'fr-ca', 'en-au', 'en-nz', 'es-ar', 'es-gt', 'es-do', 'es-hn', 'es-ni', 'es-pa', 'es-ec', 'es-py', 'es-ve', 'en-ae', 'en-lb', 'en-il', 'en-pk', 'id-id', 'tr-tr', 'ko-kr', 'th-th', 'en-ca', 'es-co', 'en-sg', 'zh-hk', 'zh-cn', 'en-in', 'en-bd', 'en-lk', 'en-np', 'en-mv', 'pt-br', 'es-pe', 'en-hk', 'ar', 'es-mx', 'ja-jp', 'en-my', 'vi-vn', 'zh-tw', 'en-se']
    
    lang_pairs = { l.partition('-')[0]:l for l in langs }

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

    Vindicar
    @Vindicar
    RTFM!
    Разве что использовать оконные функции WinAPI, но
    1. для доступа к winapi из питона потребуется сторонний пакет типа pywin32, что противоречит условию.
    2. это утомительно - гораздо утомительнее того же tkinter.
    Лезть на уровень оконного api имеет смысл только если ты хочешь сотворить что-то, что нельзя сделать стандартными фреймворками или доступными библиотеками (типа окна произвольной формы, или хитрых манипуляций чужими окнами).
    Ответ написан
    Комментировать
  • Нажатие кнопок в сообщении от Телеграм бота с помощью Python и Telethon?

    Vindicar
    @Vindicar
    RTFM!
    Быстрый гуглёж вывел на такой код:
    await messages[0].click(0)
    если messages - это коллекция сообщений (а название типа TotalList на это намекает!), то и впрямь нужно убедиться, что там есть хоть одно сообщение, и выбрать его.
    А также указать номер кнопки, которую кликаем.
    Ответ написан
    2 комментария
  • Как заставить двигаться черепаху?

    Vindicar
    @Vindicar
    RTFM!
    #подготавливаем таблицу замены символов
    transform_table = str.maketrans( { 'X': 'Z', 'Z': 'X' } )
    #функция, производящая один проход преобразования строки
    #input[::-1] - это строка, развернутая наоборот
    #метод translate() заменяет символы согласно указанной таблице замен
    def transform_once(input: str) -> str:
      return input + 'X' + input[::-1].translate(transform_table)
    #функция, производящая несколько проходов преобразования строки
    def transform_multiple(input: str, t: int) -> str:
      for _ in range(t):
        input = transform_once(input)
      return input
    Ответ написан
    Комментировать
  • Как запускать крон задачи из python virtual env?

    Vindicar
    @Vindicar
    RTFM!
    shell_guy, лучше указывать полные пути до всех файлов.
    У меня вот так примерно работает, во всяком случае.
    cd /opt/my_python_project && sudo -u username /opt/my_python_project/bin/python3 /opt/my_python_project/main.py

    где /opt/my_python_project - путь, где ты развернул venv
    /opt/my_python_project/main.py - запускаемый файл проекта
    username - имя пользователя, под которым хочешь запускать проект. Если запуск под определённой учёткой не требуется, sudo можно и опустить, но я бы не стал запускать свой скрипт от рута без реальной необходимости. Мало ли что.
    Ответ написан
    1 комментарий