使用Python显示ping信息

时间:2015-10-26 05:06:10

标签: python raspberry-pi

我正在研究从我的计算机(Windows)ping另一台计算机(Windows)。我正在使用Python代码。我的代码如下

import os
hostname = "192.168.1.2"
response = os.system ("ping -c 5 " +hostname)

if response ==0:
    print(hostname, "is up")
else:
    print(hostname, "is down")

我得到了输出

PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=128 time=1.47 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=128 time=0.816 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=128 time=0.584 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=128 time=0.749 ms
64 bytes from 192.168.1.2: icmp_seq=5 ttl=128 time=0.601 ms

--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 0.584/0.844/1.470/0.325 ms
('192.168.1.2', 'is up')

如何在统计信息后将其设置为如下所示?

Highest ping is 200 and lowest ping 40
('192.168.1.2', 'is up')

Ping is too high. consider reboot the network
('192.168.1.2', 'is up')

2 个答案:

答案 0 :(得分:0)

response = os.system ("ping -n 5 " +hostname)

即使是无法访问的响应也是0。仅当IP错误时,它才会返回1

你可能会选择与

类似的东西
try:
    response = subprocess.check_output("ping -n 5"+hostname)
    print response

    if "Destination host unreachable" in response:
        print hostname+" unreachable"

    else:
        print hostname+" Running"
    print '\n'.join(response.split('\n')[8:]) 

except:
    print "Invalid Hostname"

基于关键词你可以检查它是否可达!!

<强>输出:

<hostname> Running
Ping statistics for <hostname>:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:

        Minimum = 1ms, Maximum = 1ms, Average = 1ms

答案 1 :(得分:0)

一般来说,你有两种选择。您可以从外部命令捕获输出(使用Python标准库中的 subprocess 模块),也可以使用一些实现“ping”的代码(第三方模块)(您的Python代码中的ICMP ECHO REQUEST)。 PyPI(规范的Python包索引)中列出了一些这些:

pyping已经过时了,它的GitHub链接已经被永久破坏了...但代码仍然可以直接从PyPI获得,它仍然有效;我似乎记得我还必须应用一些小修补程序,以便将其用作库而不是命令行实用程序。)

ping甚至更旧(2010年最新更新)...但它的存储库仍在Bitbucket上。

python3-ping是最新的,需要Python3。虽然几年没有任何更新,但GitHub: python3-ping已经上线了。 (可能没有人要求......也没有任何未完成的拉动请求。)

如果您在PyPI中搜索其他替代方案,那么我建议您使用ICMP作为搜索词。搜索“ping”将获得每个引用“映射”和“抓取”等的包 - 这相当于一些不相关的命中。

请注意,后一种方法,在纯Python中重新实现ICMP处理,需要以root用户身份(在Unix / Linux上)或在MS Windows中以“管理员”权限运行Python代码。这是因为ICMP数据包必须通过“原始”套接字发送......并且由于某些原因(包括一些其他类型的ICMP数据包可能影响网络处理整个系统而不仅仅是进程,套接字,你正在与之合作) (以下是Raw Socket Programming in Python的指南以获取更多信息)。

在前一种情况下,您可以捕获命令的输出,解析它,然后将其与其他文本一起打印出来。这种方法的一个问题是,默认情况下,您的用户不会看到任何输出,直到整个程序执行和退出(所有五个ping响应都已收到或超时)。如果您愿意,可以通过使用无缓冲的I / O来解决这个问题...在子进程发出它时捕获每一行输出并在子进程输出管道上执行下一个read()之前将其中继。在后一种情况下,您可以对执行流程进行更细粒度的控制......您甚至可以同时运行多个线程同时ping多个目标等。