在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_pingPing.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