使用反馈在Python中进行Ping操作

时间:2015-09-16 21:03:29

标签: python subprocess ping

所以我在Python中这样一个菜鸟很痛苦,但我想找到一种方法来PING一个网站,然后吐出一个'if / else'条款。

到目前为止,我有这个:

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 time = 13.384 ms

并说“如果ping时间超过12.000 ms那么就这样做” 其他     “做那个”

现在我正在打印,但很快我就想改变它,所以别的。

1 个答案:

答案 0 :(得分:0)

subprocess.Popen通常不是你想要的那个。所有简单任务都有便利功能。在您的情况下,我认为您需要subprocess.check_output

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

有很多方法可以解析生成的输出字符串。我喜欢正则表达式:

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

re.findall会返回list str,但您希望将其转换为单个数字,以便进行数值比较。使用float()构造函数将str转换为float,然后计算平均值:

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,上面的正则表达式工作。在您的机器上,运行其他操作系统,可能需要不同。