我已经看过许多如何使用python确定主机状态的例子,但我似乎无法弄清楚如何以毫秒为单位将响应时间发送给var。
import time
start = time.time()
result = ping_host(hostname)
duration = time.time() - start
所以我应该替换ping_host或主机名?
答案 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()
如果您真的想自己完成所有必要的管道工作(但可能不这样做,特别是如果您不了解什么是“必要的管道" 表示这里)。