@omichkun

Как получить вывод команды ping в Python?

Для изучения питона попробовал написать свой велосипед - пинговалку определенного хоста.
Собственно сама команда пинга выглядит вот так (нашел ее на каком-то сайте):
result=subprocess.call(["ping",'-n','1', str(address)],shell=True,stdout=subprocess.PIPE)

Как я понял stdout=subprocess.PIPE - это перехват вывода результатов команды.
Так вот я хочу спарсить этот результат и выдавать предупреждение не только по пристутствию/отсутствию пинга, но и по его длительности.

Как мне завести результат выдачи команды ping в переменную для дальнейшего анализа?
  • Вопрос задан
  • 13832 просмотра
Пригласить эксперта
Ответы на вопрос 3
@kvothe
Использовать Popen. call() возвращает код завершения команды.
Ответ написан
Комментировать
@alexzaporozhets
Попробуй использовать http://amoffat.github.io/sh/

>>> from sh import ping
>>> res = ping("-c", 1, 'yandex.ru')
>>> res
PING yandex.ru (93.158.134.11): 56 data bytes
64 bytes from 93.158.134.11: icmp_seq=0 ttl=57 time=34.563 ms

--- yandex.ru ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 34.563/34.563/34.563/0.000 ms
Ответ написан
AleksVersus
@AleksVersus
графоман
Нашёл на коудпэйпер хорошее решение.
import os
#
ip = '127.0.0.1' # нужный айпи
response = os.popen(f'ping {ip}').read()
print(response)

Таким образом вы извлекаете сообщение из "командной строки". Проблема теперь в том, чтобы правильно перекодировать это сообщение. Дело в том, что у меня оно в кодировке cp1251 явно. Однако сконвертить, применив encode-decode у меня не получилось. Пришлось подкостылить:
import os
#
ip = '127.0.0.1' # нужный айпи
ping_file = "C:\\ping.txt"
response = os.popen(f'ping {ip} > "{ping_file}"').read()
with open(ping_file, 'r', encoding='cp866') as file:
    ping = file.read()
print(ping)

Если кто-то умеет конвертить кодировку, дополните мой ответ.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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