Ping a un sitio en Python?

El código básico es:

from Tkinter import * import os,sys ana= Tk() def ping1(): os.system('ping') a=Button(pen) ip=("192.168.0.1") a.config(text="PING",bg="white",fg="blue") a=ping1.ip ??? a.pack() ana.mainloop() 

¿Cómo podría hacer ping a un sitio o dirección?

Vea este ping de Python puro por Matthew Dixon Cowles y Jens Diemer . Además, recuerde que Python requiere root para generar sockets ICMP (es decir, ping) en linux.

 import ping, socket try: ping.verbose_ping('www.google.com', count=3) delay = ping.Ping('www.wikipedia.org', timeout=2000).do() except socket.error, e: print "Ping Error:", e 

El código fuente en sí es fácil de leer, vea las implementaciones de verbose_ping y de Ping.do para inspirarse.

Dependiendo de lo que desee lograr, probablemente sea más fácil llamar al comando ping del sistema.

Usar el módulo de subproceso es la mejor manera de hacerlo, ¡aunque debe recordar que el comando ping es diferente en diferentes sistemas operativos!

 import subprocess host = "www.google.com" ping = subprocess.Popen( ["ping", "-c", "4", host], stdout = subprocess.PIPE, stderr = subprocess.PIPE ) out, error = ping.communicate() print out 

No tienes que preocuparte por los personajes de shell-escape. Por ejemplo..

 host = "google.com; `echo test` 

.. no ejecutará el comando echo.

Ahora, para obtener realmente los resultados de ping, podría analizar la variable de out . Ejemplo de salida:

 round-trip min/avg/max/stddev = 248.139/249.474/250.530/0.896 ms 

Ejemplo regex:

 import re matcher = re.compile("round-trip min/avg/max/stddev = (\d+.\d+)/(\d+.\d+)/(\d+.\d+)/(\d+.\d+)") print matcher.search(out).groups() # ('248.139', '249.474', '250.530', '0.896') 

Una vez más, recuerde que la salida variará según el sistema operativo (e incluso la versión de ping ). Esto no es lo ideal, pero funcionará bien en muchas situaciones (donde conoce las máquinas en las que se ejecutará el script)

Puede encontrar la presentación de Noah Gift Creando herramientas ágiles de línea de comandos con Python . En él combina subproceso, cola y subprocesos para desarrollar una solución capaz de hacer ping a los hosts simultáneamente y acelerar el proceso. A continuación se muestra una versión básica antes de que agregue el análisis de la línea de comandos y algunas otras características. El código de esta versión y otros se pueden encontrar aquí.

 #!/usr/bin/env python2.5 from threading import Thread import subprocess from Queue import Queue num_threads = 4 queue = Queue() ips = ["10.0.1.1", "10.0.1.3", "10.0.1.11", "10.0.1.51"] #wraps system ping command def pinger(i, q): """Pings subnet""" while True: ip = q.get() print "Thread %s: Pinging %s" % (i, ip) ret = subprocess.call("ping -c 1 %s" % ip, shell=True, stdout=open('/dev/null', 'w'), stderr=subprocess.STDOUT) if ret == 0: print "%s: is alive" % ip else: print "%s: did not respond" % ip q.task_done() #Spawn thread pool for i in range(num_threads): worker = Thread(target=pinger, args=(i, queue)) worker.setDaemon(True) worker.start() #Place work in queue for ip in ips: queue.put(ip) #Wait until worker threads are done to exit queue.join() 

También es autor de: Python para Unix y administración de sistemas Linux.

http://ecx.images-amazon.com/images/I/515qmR%2B4sjL._SL500_AA240_.jpg

Es difícil decir cuál es tu pregunta, pero hay algunas alternativas.

Si quiere ejecutar literalmente una solicitud utilizando el protocolo de ping ICMP, puede obtener una biblioteca ICMP y ejecutar la solicitud de ping directamente. Google “Python ICMP” para encontrar cosas como esta icmplib . Es posible que desee mirar scapy , también.

Esto será mucho más rápido que usar os.system("ping " + ip ) .

Si tiene la intención de “hacer ping” en un cuadro para ver si está activo, puede usar el protocolo de eco en el puerto 7.

Para eco, utiliza la biblioteca de socket para abrir la dirección IP y el puerto 7. Escribe algo en ese puerto, envía un retorno de carro ( "\r\n" ) y luego lee la respuesta.

Si quiere hacer “ping” en un sitio web para ver si el sitio se está ejecutando, debe usar el protocolo http en el puerto 80.

Para verificar o verificar correctamente un servidor web, usa urllib2 para abrir una URL específica. ( /index.html siempre es popular) y lea la respuesta.

Todavía hay más significado potencial de “ping” incluyendo “traceroute” y “dedo”.

Hice algo similar de esta manera, como inspiración:

 import urllib import threading import time def pinger_urllib(host): """ helper function timing the retrival of index.html TODO: should there be a 1MB bogus file? """ t1 = time.time() urllib.urlopen(host + '/index.html').read() return (time.time() - t1) * 1000.0 def task(m): """ the actual task """ delay = float(pinger_urllib(m)) print '%-30s %5.0f [ms]' % (m, delay) # parallelization tasks = [] URLs = ['google.com', 'wikipedia.org'] for m in URLs: t = threading.Thread(target=task, args=(m,)) t.start() tasks.append(t) # synchronization point for t in tasks: t.join() 

Aquí hay un pequeño fragmento de subprocess utilizando subprocess . El método check_call devuelve 0 para éxito, o genera una excepción. De esta manera, no tengo que analizar la salida de ping. Estoy usando shlex para dividir los argumentos de la línea de comandos.

  import subprocess import shlex command_line = "ping -c 1 www.google.comsldjkflksj" args = shlex.split(command_line) try: subprocess.check_call(args,stdout=subprocess.PIPE,stderr=subprocess.PIPE) print "Website is there." except subprocess.CalledProcessError: print "Couldn't get a ping." 

lea un nombre de archivo, el archivo contiene la url por línea, así:

 http://www.poolsaboveground.com/apache/hadoop/core/ http://mirrors.sonic.net/apache/hadoop/core/ 

comando de uso:

 python url.py urls.txt 

obtener el resultado:

 Round Trip Time: 253 ms - mirrors.sonic.net Round Trip Time: 245 ms - www.globalish.com Round Trip Time: 327 ms - www.poolsaboveground.com 

código fuente (url.py):

 import re import sys import urlparse from subprocess import Popen, PIPE from threading import Thread class Pinger(object): def __init__(self, hosts): for host in hosts: hostname = urlparse.urlparse(host).hostname if hostname: pa = PingAgent(hostname) pa.start() else: continue class PingAgent(Thread): def __init__(self, host): Thread.__init__(self) self.host = host def run(self): p = Popen('ping -n 1 ' + self.host, stdout=PIPE) m = re.search('Average = (.*)ms', p.stdout.read()) if m: print 'Round Trip Time: %s ms -' % m.group(1), self.host else: print 'Error: Invalid Response -', self.host if __name__ == '__main__': with open(sys.argv[1]) as f: content = f.readlines() Pinger(content) 

Eche un vistazo al código de Jeremy Hylton , si necesita hacer una implementación más compleja y detallada en Python en lugar de solo llamar ping .

Puede encontrar una versión actualizada del script mencionado que funciona tanto en Windows como en Linux aquí

 import subprocess as s ip=raw_input("Enter the IP/Domain name:") if(s.call(["ping",ip])==0): print "your IP is alive" else: print "Check ur IP" 

Uso el módulo ping de Lars Strand. Busque en Google “Lars Strand python ping” y encontrará muchas referencias.

usando el comando ping del sistema para hacer ping a una lista de hosts:

 import re from subprocess import Popen, PIPE from threading import Thread class Pinger(object): def __init__(self, hosts): for host in hosts: pa = PingAgent(host) pa.start() class PingAgent(Thread): def __init__(self, host): Thread.__init__(self) self.host = host def run(self): p = Popen('ping -n 1 ' + self.host, stdout=PIPE) m = re.search('Average = (.*)ms', p.stdout.read()) if m: print 'Round Trip Time: %s ms -' % m.group(1), self.host else: print 'Error: Invalid Response -', self.host if __name__ == '__main__': hosts = [ 'www.pylot.org', 'www.goldb.org', 'www.google.com', 'www.yahoo.com', 'www.techcrunch.com', 'www.this_one_wont_work.com' ] Pinger(hosts) 

Use esto, está probado en Python 2.7 y funciona bien, devuelve el tiempo de ping en milisegundos si el éxito y el retorno Falso en caso de error.

 import platform,subproccess,re def Ping(hostname,timeout): if platform.system() == "Windows": command="ping "+hostname+" -n 1 -w "+str(timeout*1000) else: command="ping -i "+str(timeout)+" -c 1 " + hostname proccess = subprocess.Popen(command, stdout=subprocess.PIPE) matches=re.match('.*time=([0-9]+)ms.*', proccess.stdout.read(),re.DOTALL) if matches: return matches.group(1) else: return False