2016-11-07 3 views
0

Вот мой простой пример:Как поймать ошибку ping с Python?

import subprocess 
cmd = 'ping something.local -c 1' 
tail = 'tail -n 3' 

ping = subprocess.Popen(cmd.split(' '), stdout=subprocess.PIPE) 
tail = subprocess.Popen(tail.split(' '), stdin=ping.stdout, stdout=subprocess.PIPE) 
ping.stdout.close() 
out, err = tail.communicate() 
print 'Print values:' 
print out 
print err 

А вот выход пример сценария:

[~/python]$ python ping_stats.py 
ping: cannot resolve tpeo.local: Unknown host 
Print values: 

None 

Итак, мои переменные out и err являются «пустыми», но мне нужно сообщение с ping: cannot resolve tpeo.local: Unknown host об ошибке , Как я могу это получить?

+0

Используйте os.system вместо Popen. А затем проверьте код ответа –

+0

Итак, невозможно ли это сделать с подпроцессом.Popen? –

ответ

0

Просто зарегистрируйте стандартную ошибку в результатах через stderr=subprocess.STDOUT.
Кроме того, использование shlex.split вместо string.split(' '):

import subprocess 
import shlex 

cmd = 'ping something.local -c 1' 

ping = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, 
         stderr=subprocess.STDOUT) 
out = ping.communicate()[0] 

Или:

import subprocess 
import shlex 

cmd = 'ping unknown -c 1' 

ping = subprocess.Popen(shlex.split(cmd), stderr=subprocess.PIPE, 
         stdout=subprocess.PIPE) 
out, err = ping.communicate() 

print out 
print err 
+0

Как насчет трубы '| хвост -n 3' для вашего примера? –

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