在Python中Ping一个站点?
基本的代码是:
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()
我怎么能ping一个网站或地址?
看到这个由Matthew Dixon Cowles和Jens Diemer所做的 纯Python平台 。 另外,请记住,Python需要root在Linux中产生ICMP(即ping)套接字。
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
源代码本身很容易阅读,请参阅verbose_ping
和Ping.do
的实现以获得灵感。
您可能会发现Noah Gift的演示文稿使用Python创建敏捷命令行工具 。 在这个过程中,他将子进程Queue和线程相结合,开发了能够同时ping主机并加速进程的解决方案。 下面是添加命令行解析和其他一些功能之前的基本版本。 这个版本和其他的代码可以在这里找到
#!/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()
他还是Unix和Linux系统管理的Python的作者
http://ecx.images-amazon.comhttp://img.dovov.comI/515qmR%2B4sjL._SL500_AA240_.jpg
根据你想要存档的内容,你可能是最简单的调用系统ping命令。
使用子进程模块是这样做的最好方法,但是您必须记住不同的操作系统上的ping命令是不同的!
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
你不需要担心shell转义字符。 例如..
host = "google.com; `echo test`
.. 不会执行echo命令。
现在,要真正获得ping结果,可以解析out
变量。 示例输出:
round-trip min/avg/max/stddev = 248.139/249.474/250.530/0.896 ms
示例正则表达式:
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')
再次记住,输出将取决于操作系统(甚至是ping
的版本)。 这并不理想,但是在许多情况下(如果您知道脚本将运行的机器)
很难说你的问题是什么,但也有一些选择。
如果您的意思是使用ICMP ping协议从字面上执行请求,则可以获得ICMP库并直接执行ping请求。 谷歌“Python的ICMP”来找到像这样的icmplib 。 你也可以看看scapy 。
这比使用os.system("ping " + ip )
要快得多。
如果你的意思是一般地“ping”一个盒子来查看它是否启动,你可以在端口7上使用echo协议。
对于echo,你使用套接字库来打开IP地址和端口7.你在那个端口上写了一些东西,发送一个回车( "\r\n"
),然后阅读回复。
如果您的意思是“ping”一个网站来查看网站是否正在运行,您必须在端口80上使用http协议。
为了或正确检查一个Web服务器,你使用urllib2来打开一个特定的URL。 ( /index.html
总是很受欢迎)并阅读回复。
“ping”包含“traceroute”,“finger”等更多的潜在含义。
我以这样的方式做了类似的事情:
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()
这是一个使用subprocess
的简短代码片段。 check_call
方法要么成功返回0,要么引发异常。 这样,我不必解析ping的输出。 我正在使用shlex
来分割命令行参数。
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."
读一个文件名,文件每行包含一个url,如下所示:
http://www.poolsaboveground.com/apache/hadoop/core/ http://mirrors.sonic.net/apache/hadoop/core/
使用命令:
python url.py urls.txt
得到结果:
Round Trip Time: 253 ms - mirrors.sonic.net Round Trip Time: 245 ms - www.globalish.com Round Trip Time: 327 ms - www.poolsaboveground.com
源代码(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)
您可以在这里找到可在Windows和Linux上运行的所述脚本的更新版本
看看Jeremy Hylton的代码 ,如果你需要在Python中做一个更复杂,更详细的实现,而不是仅仅调用ping
。
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"
我使用Lars Strand的ping模块。 谷歌为“拉斯Strand蟒蛇坪”,你会发现很多的参考。
使用system ping命令ping主机列表:
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)
使用它在Python 2.7上进行测试,工作正常,如果成功返回ping时间(以毫秒为单位),返回False失败。
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