python - Parse ping kommando output

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne parse udgangen af ​​kommandoen ping under Windows ved hjælp af Python. Især min, max og gennemsnitlig RTT.


Jeg har følgende stykke kode:


from sys import platform
import re

if platform == "linux" or platform == "darwin":
    command=["ping", "-c", "3", "-i", "0.2", IP]
    timeout=0.5
else:
    command=["ping", "-n", "1", IP]
    timeout=0.2  proc=subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
try:
    [out, err]=proc.communicate(timeout=timeout)
    if proc.returncode == 0:
        if platform == "linux" or platform == "darwin":
            # rtt min/avg/max/mdev = 578.263/917.875/1013.707/132.095 ms
            avgRTT=re.search("rtt min/avg/max/mdev = (d+.d+)/(d+.d+)/(d+.d+)/(d+.d+)", str(out)).group(2)
        else:
            # Approximate round trip times in milli-seconds: Minimum = 63ms, Maximum = 64ms, Average = 63ms
            avgRTT=re.search("Minimum = (d+), Maximum = (d+), Average = (d+)", str(out))
            print(avgRTT.group())
except subprocess.TimeoutExpired:
    proc.kill()


Det virker godt under GNU/Linux og Mac OS X, mens det ikke virker for Windows. Jeg prøvede også med oplysningerne her uden succes.

Bedste reference


Jeg har taget din kode og ændret bare nogle få små ting. ms manglede i regex for windows og skulle bare tilføje nogle inklusioner og mellemrum (sandsynligvis delvis på grund af StackOverflow-formatering). kører nu i min windows 7.0 boks helt fint. Du skal bare kunne kopiere/indsætte/hit og få de ønskede resultater :)


from sys import platform
import subprocess
import re

IP = "127.0.0.1"

if platform == "linux" or platform == "darwin":
    command=["ping", "-c", "3", "-i", "0.2", IP]
    timeout=0.5
else:
    command=["ping", "-n", "1", IP]
    timeout=0.2
    proc=subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

try:
    [out, err]=proc.communicate(timeout=timeout)
    if proc.returncode == 0:
        if platform == "linux" or platform == "darwin":
            # rtt min/avg/max/mdev = 578.263/917.875/1013.707/132.095 ms
            avgRTT=re.search("rtt min/avg/max/mdev = (d+.d+)/(d+.d+)/(d+.d+)/(d+.d+)", str(out)).group(2)
        else:
            # Approximate round trip times in milli-seconds: Minimum = 63ms, Maximum = 64ms, Average = 63ms
            avgRTT=re.search("Minimum = (d+)ms, Maximum = (d+)ms, Average = (d+)", str(out))
            print(avgRTT.group())
except subprocess.TimeoutExpired:
    proc.kill()


Produktion:


Indtast billedbeskrivelse her [8]