Python Ping响应时间

时间:2015-04-26 13:05:35

标签: python ping icmp

我已经看过许多如何使用python确定主机状态的例子,但我似乎无法弄清楚如何以毫秒为单位将响应时间发送给var。

import time
start = time.time()
result = ping_host(hostname)
duration = time.time() - start

所以我应该替换ping_host或主机名?

2 个答案:

答案 0 :(得分:2)

从高级别开始,您只需使用time模块即可。 time.time给出了自纪元以来的秒数,通常精度至少为毫秒。

start = time.time()
result = ping_host(hostname)
duration = time.time() - start

duration是一个变量,用于保存ping所用的时间time提供的最高精度。

答案 1 :(得分:1)

如果您想运行外部实用程序 ping 并解析其输出,请尝试类似

import subprocess

for ip in list_of_ip_addresses_or_host_names:
    result = subprocess.run(
        # Command as a list, to avoid shell=True
        ['ping', '-c', '1', ip],
        # Expect textual output, not bytes; let Python .decode() on the fly
        text=True,
        # Shorthand for stdout=PIPE stderr=PIPE etc etc
        capture_output=True,
        # Raise an exception if ping fails (maybe try/except it separately?)
        check=True)
    for line in result.stdout.splitlines():
        # Sample output from my ping:
        # PING hostname.example.com (10.9.8.7): 56 data bytes
        # 64 bytes from 10.130.42.70: icmp_seq=0 ttl=60 time=11.190 ms
        # 
        # --- hostname.example.com ping statistics ---
        # 1 packets transmitted, 1 packets received, 0.0% packet loss
        # round-trip min/avg/max/stddev = 11.190/11.190/11.190/0.000 ms
        if "icmp_seq" in line:
            timing = line.split('time=')[-1].split(' ms')[0]
            print(ip, timing)

如果您愿意,您也许可以调整 -c 参数以发送多个数据包,然后您可能应该解析往返 min/avg/max/stdev 行。

如果未找到预期的字符串,split 索引会小心避免出现 IndexError,但当然结果仍然是假的;这可以做得更紧,例如通过使用正则表达式,或者在尝试解析之前只要求 time= ms 字符串也在行中。

subprocess.run()subprocess 包的主要现代 API;您也可以使用遗留函数 subprocess.check_output 或原始 subprocess.Popen() 如果您真的想自己完成所有必要的管道工作(但可能不这样做,特别是如果您不了解什么是“必要的管道" 表示这里)。