hekkaaa
@hekkaaa
C#/.NET Developer

Как перехватывать информацию из консоли?

Как перехватывать информацию из консоли в Python?
Мне нужно запустить os.system('ping -c 1 ya.ru') и перехватить информацию построчно (да прям все что там пишут и потом проанализировать, но это другой вопрос) из консоли.
Exitcode меня не совсем устраивает в данном случае по результату ping, мне нужна именно информация типа :

PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=108 time=64.503 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=108 time=57.064 ms


Пока я вижу только попытку импорта информации в txt и потом от туда доставать тем же Python строчки и парсить что нужно.
Есть ли вариант проще?
Google по этому поводу import io - но мне не совсем понятны предложенные примеры.
  • Вопрос задан
  • 2205 просмотров
Решения вопроса 1
sanya84
@sanya84
Фанатик Python 3
from subprocess import Popen, PIPE


def get_ping():
    args = ["ping", "-n", "4", "www.ya.ru"] # -n требуются права Администратора
    process = Popen(args, stdout=PIPE)
    """
    # Построчное чтение данных
    for line in process.stdout:
  	    print("stdout:", line.decode('cp866'))
    """
    data, error = process.communicate()  # Распаковка кортежа
    print(error)
    return data.decode(encoding='cp866') # cp866 для Windows

def main():
    print(get_ping())
    input()

if __name__ == '__main__':
    main()
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@bbkmzzzz
from subprocess import Popen, PIPE

 # запускаем команду, вывод перенаправляем в PIPE
proc = Popen('cmd /c ping 8.8.8.8', stdout=PIPE)

#  по завершении работы proc, прочитать данные из
# stdout (и отправить ввод, если надо), результат не декодирован (bytes)
res = proc.communicate()[0]  # <- communicate возвращает кортеж (stdout_data, stderr_data)

print(res.decode('cp866')) # выводим на печать декодированные данные
Ответ написан
Комментировать
@Miit
async awaiter
Осторожно, быдлокод

import os
from threading import Thread


def listen(filename, count):
    # запускаем в отдельном потоке команду
    t = Thread(target=os.system, args=((f'ping -c {count} yandex.ru > {filename}'),))
    t.start()
    # ждем начала работы потока, после чего открываем файл
    while not os.path.exists(filename):
        pass
    else:
        f = open(filename, 'r')
    i = 0
    while i <= count:
        data = f.read()
        if data:
            print(data)
            i += 1

listen('out', 5)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы