2015-09-16 63 views
-1

所以我在Python中是這樣一個noob,它很痛苦,但我試圖想出一種方法來Ping一個站點,然後吐出一個'if/else'子句。在Python中使用反饋Pinging

到目前爲止,我有這樣的:

import subprocess 
command = "ping -c 3 www.google.com" # the shell command 
process = subprocess.Popen(command, stdout=subprocess.PIPE,  
stderr=None, shell=True) 

#Launch the shell command: 
output = process.communicate() 

print output[0] 

下面是我出差錯,這裏是兩部分:

if output == 0.00 
print "server is good" 

else 
print "server is hosed" 

顯然部分2不工作了。

我的問題是,我該如何「讀」的ping結果(毫秒) icmp_seq = 0 TTL = 44時間= 13.384毫秒

,並說「如果ping時間快於12.000毫秒然後做這個「 其他 」做那個「

現在我只是做一個打印,但很快我想改變,所以別的東西。

+0

爲什麼不只是做一個請求作爲心臟跳動? – gerosalesc

回答

0

subprocess.Popen通常不是你想要的。所有簡單任務都有便利功能。在你的情況,我想你想subprocess.check_output

output = subprocess.check_output(command, shell=True) 

有很多方法來分析所得到的輸出字符串。我喜歡的正則表達式:

matches = re.findall(" time=([\d.]+) ms", output) 

re.findall返回str一個list,但想要將其轉換成一個數字,這樣就可以做數字比較。使用float()構造到str秒值進行轉換,以float s,然後計算平均:

matches = [float(match) for match in matches] 
ms = sum(matches)/len(matches) 

樣例程序:

import subprocess 
import re 

# Run the "ping" command 
command = "ping -c 3 www.google.com" # the shell command 
output = subprocess.check_output(command, shell=True) 

# And interpret the output 
matches = re.findall(" time=([\d.]+) ms", output) 
matches = [float(match) for match in matches] 
ms = sum(matches)/len(matches) 

if ms < 12: 
    print "Yay" 
else: 
    print "Boo" 

注意的ping輸出不規範。在我的機器上運行Ubuntu 14.04,上面的正則表達式起作用。在你的機器上運行一些其他的操作系統,它可能需要不同。

+0

謝謝 - 所以Popen就像是真的打開終端,對嗎?我注意到當我這樣做時,它會顯示3條ping線供觀看。使用check_output,它只顯示'Yay'或'Boo'。腳本是否可以打印ping線? – Deez

+0

是的,所有'subprocess'系列函數都會運行您可能會在終端上調用的命令。由'check_output(「ping」)'返回的文本將與在命令提示符下鍵入'ping'的結果相同。 –

+0

如果您希望我的示例程序顯示ping的整個輸出,請在末尾添加'print output'。 –