9
votes

Mesurer la latence de ping d'un serveur - Python

J'ai une liste de serveur adresses IP , j'ai besoin de vérifier si chacun est en ligne et combien de temps la latence est. . .

Je n'ai trouvé aucun mode de mise en œuvre tout droit de la mise en œuvre, et il semble y avoir quelques problèmes pour calculer avec précision la latence.


Des idées?


5 commentaires

Cela a quelques conseils utiles: Stackoverflow.com/questions/316866/ping-a-site-in- Python


@Dan: Ils appellent tous des commandes OS ...


En fait, la meilleure réponse sur ce fil est une implémentation python python qui semble faire exactement ce que vous voulez.


@Fogle: Je ne sais pas comment je l'ai manqué ... merci


Dupliqué possible de ping un site à Python?


6 Réponses :



7
votes

Si vous êtes déjà à l'aise avec des chaînes d'analyse, vous pouvez utiliser le module de sous-processus pour obtenir les données que vous recherchez dans une chaîne, comme ceci:

>>> import subprocess
>>> p = subprocess.Popen(["ping.exe","www.google.com"], stdout = subprocess.PIPE)
>>> print p.communicate()[0]

Pinging www.l.google.com [209.85.225.99] with 32 bytes of data:

Reply from 209.85.225.99: bytes=32 time=59ms TTL=52
Reply from 209.85.225.99: bytes=32 time=64ms TTL=52
Reply from 209.85.225.99: bytes=32 time=104ms TTL=52
Reply from 209.85.225.99: bytes=32 time=64ms TTL=52

Ping statistics for 209.85.225.99:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 59ms, Maximum = 104ms, Average = 72ms


4 commentaires

Ce n'est pas une très bonne approche car il va évidemment être spécifique à la plate-forme (mais il n'y a pas besoin de cela).


Et si nous voulons extraire le temps de réponse comme une variable?


C'est là que "si vous êtes à l'aise avec analyse" entre ... Commencez par quelque chose comme: importer re; Timestrs = repeublement ("Time = [0-9] + MS"). RÉSUCTALL (STR (P.COMMUNICE () [0])) et affinez-le si de là ... Le module Regex (RE) est plutôt génial


>>> Timestr ['Time = 12ms', 'Time = 12ms', 'Time = 14ms', 'Time = 13ms']



5
votes

suivant suggestion de Hlovdal pour fonctionner avec FPPRES , voici ma solution que j'utilise pour tester les proxies. Je n'ai essayé que sous Linux. Si aucun temps de ping ne peut être mesuré, une grande valeur est renvoyée. Utilisation: Imprimer get_ping_time (': ') code>.

import shlex  
from subprocess import Popen, PIPE, STDOUT

def get_simple_cmd_output(cmd, stderr=STDOUT):
    """
    Execute a simple external command and get its output.
    """
    args = shlex.split(cmd)
    return Popen(args, stdout=PIPE, stderr=stderr).communicate()[0]

def get_ping_time(host):
    host = host.split(':')[0]
    cmd = "fping {host} -C 3 -q".format(host=host)
    res = [float(x) for x in get_simple_cmd_output(cmd).strip().split(':')[-1].split() if x != '-']
    if len(res) > 0:
        return sum(res) / len(res)
    else:
        return 999999


3 commentaires

Je pense que processus. est une faute de frappe dans cet extrait


Combien de temps cela attend-il avant de terminer une demande?


Remarque: dans Python 3, le résultat de la popen doit être décodé: popen (args, stdout = pipe, starr = stardr) .Communicate () [0] .Decode ()




1
votes

Merci de Jabba mais ce code ne fonctionne pas correctement pour moi, donc je change quelque chose comme suit

import shlex
from subprocess import Popen, PIPE, STDOUT


def get_simple_cmd_output(cmd, stderr=STDOUT):
    """
    Execute a simple external command and get its output.
    """
    args = shlex.split(cmd)
    return Popen(args, stdout=PIPE, stderr=stderr).communicate()[0]


def get_ping_time(host):
    host = host.split(':')[0]
    cmd = "fping {host} -C 3 -q".format(host=host)
    # result = str(get_simple_cmd_output(cmd)).replace('\\','').split(':')[-1].split() if x != '-']
    result = str(get_simple_cmd_output(cmd)).replace('\\', '').split(':')[-1].replace("n'", '').replace("-",
                                                                                                        '').replace(
        "b''", '').split()
    res = [float(x) for x in result]
    if len(res) > 0:
        return sum(res) / len(res)
    else:
        return 999999


def main():
    # sample hard code for test
    host = 'google.com'
    print([host, get_ping_time(host)])

    host = 'besparapp.com'
    print([host, get_ping_time(host)])



if __name__ == '__main__':
    main()


1 commentaires

Cela fonctionne-t-il sur Windows? Ou est-ce spécifique à Linux?



0
votes

Ce message est un peu vieux et je pense que de meilleures façons existe aujourd'hui. Je suis nouveau à Python, mais voici ce que j'ai fait sur mon projet: xxx

résultat: xxx

Vous pouvez trouver la bibliothèque Pythonping ici : https://pypi.org/project/pythonping/


0 commentaires