python - barplot - pandas plot
Ping un sitio en Python? (13)
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?
Aquí hay un pequeño fragmento de subprocess
. El método check_call
devuelve 0 para tener é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 comando.
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."
Dependiendo de lo que quiera 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 necesita preocuparse por los caracteres de escape de shell. Por ejemplo..
host = "google.com; `echo test`
..no ejecutará el comando echo.
Ahora, para obtener realmente los resultados del ping, puede 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'')
De nuevo, recuerde que la salida variará según el sistema operativo (e incluso la versión de ping
). Esto no es ideal, pero funcionará bien en muchas situaciones (donde conoce las máquinas en las que se ejecutará el script)
Eche un vistazo al código de Jeremy Hylton , si necesita realizar una implementación más compleja y detallada en Python en lugar de simplemente hacer ping
.
Es difícil decir cuál es su pregunta, pero hay algunas alternativas.
Si tiene la intención de 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 desea genéricamente "hacer ping" en un cuadro para ver si está activo, puede usar el protocolo de eco en el puerto 7.
Para echo, 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 un "ping" en un sitio web para ver si el sitio se está ejecutando, debe usar el protocolo http en el puerto 80.
Para verificar correctamente un servidor web, use urllib2 para abrir una URL específica. ( /index.html
siempre es popular) y lee la respuesta.
Todavía hay más significado potencial de "ping", que incluye "traceroute" y "finger".
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()
Mira este ping puro de Python por Matthew Dixon Cowles y Jens Diemer . Además, recuerde que Python requiere root para generar conectores 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 inspiración.
Puede encontrar la presentación de Noah Gift Creando herramientas de línea de comandos ágiles con Python . En él, combina el subproceso, la cola y el subprocesamiento para desarrollar una solución capaz de hacer ping a los hosts al mismo tiempo y acelerar el proceso. A continuación se muestra una versión básica antes de agregar el análisis de línea de comandos y algunas otras características. El código de esta versión y otras se puede encontrar here
#!/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 administración de sistemas Unix y Linux
http://ecx.images-amazon.com/images/I/515qmR%2B4sjL._SL500_AA240_.jpg
Puede encontrar una versión actualizada del script mencionado que funciona tanto en Windows como en Linux here
Use esto, ha sido probado en Python 2.7 y funciona bien, devuelve el tiempo de ping en milisegundos si es exitoso y devuelve False on fail.
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
Yo uso el módulo ping de Lars Strand. Google para "Lars Strand python ping" y encontrarás muchas referencias.
lea un nombre de archivo, el archivo contiene la url por línea, como esta:
http://www.poolsaboveground.com/apache/hadoop/core/
http://mirrors.sonic.net/apache/hadoop/core/
usar comando:
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)
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)
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"