2016-08-24 5 views
0

С этим:Использование подпроцесса для ping-адреса и получения среднего вывода ping в Python?

import subprocess 

hostname = '104.160.142.3' 
pingResponse = subprocess.Popen(["ping", hostname, "-n", '1'], stdout=subprocess.PIPE).stdout.read() 

Я получаю строку pingResponse:

b'\r\nPinging 104.160.142.3 with 32 bytes of data:\r\nReply from 104.160.142.3: bytes=32 time=159ms TTL=60\r\n\r\nPing statistics for 104.160.142.3:\r\n Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),\r\nApproximate round trip times in milli-seconds:\r\n Minimum = 159ms, Maximum = 159ms, Average = 159ms\r\n' 

, и я в основном хочу, чтобы получить среднее мс часть и сохранить его в другой строке, но если я пытаюсь напечатать слово словом:

for i in pingResponse: 
    print(i) 

Я просто получаю кучу цифр:

58 
32 
83 
101 
110 
116 
32 
61 
32 
49 
44 
32 
82 
101 
99 
101 
105 
118 
101 
100 
32 
61 
32 
49 
44 
32 
76 
111 
115 
116 
32 
61 
32 
48 
32 
40 
48 
37 
32 
108 
111 
115 
115 
41 
44 
13 
10 
65 
112 
112 
114 
111 
120 
105 
109 
97 
116 
101 
32 
114 
111 
117 
110 
100 
32 
116 
114 
105 
112 
32 
116 
105 
109 
101 
115 
32 
105 
110 
32 
109 
105 
108 
108 
105 
45 
115 
101 
99 
111 
110 
100 
115 
58 
13 
10 
32 
32 
32 
32 
77 
105 
110 
105 
109 
117 
109 
32 
61 
32 
52 
52 
109 
115 
44 
32 
77 
97 
120 
105 
109 
117 
109 
32 
61 
32 
52 
52 
109 
115 
44 
32 
65 
118 
101 
114 
97 
103 
101 
32 
61 
32 
52 
52 
109 
115 
13 
10 

Как сохранить среднее значение ms в другой строке?

+0

Обратите внимание на префикс б ссылается на байт, но [поведение этого отличается в зависимости от того, используете ли вы Python 2/3.] (http://stackoverflow.com/a/6269785/868044). Даже если бы это рассматривалось как строка, итерация по ней таким образом могла бы чередовать символ по характеру, а не слово в слово (для этого вам нужно использовать «split()»). Похоже, вы можете использовать Python 3, в этом случае вы видите целочисленное значение каждого байта в значении. – Dan

+0

Будьте осторожны, потому что разные системы имеют разные реализации ping, выход которых сильно варьируется. Например, вот строка статистики команды ping, которая у меня есть: «round-trip min/avg/max = 2/3/6 ms'. – spectras

ответ

2

Вы получаете числа, потому что это двоичная строка (обратите внимание на b в начале).

Вам нужно будет decode это первое, то вы можете использовать regex:

import re 

s = b'\r\nPinging 104.160.142.3 with 32 bytes of data:\r\nReply from 104.160.142.3: bytes=32 time=159ms TTL=60\r\n\r\nPing statistics for 104.160.142.3:\r\n Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),\r\nApproximate round trip times in milli-seconds:\r\n Minimum = 159ms, Maximum = 159ms, Average = 159ms\r\n' 

s = s.decode() 

print(re.search(r'Average = (\d+)', s, re.MULTILINE).group(1)) 

>> 159 
Смежные вопросы