Python: ping网段内所有ip并

发布时间:2019-09-07 08:11:32编辑:auto阅读(1544)

        今天用Python写了一段小代码,实现的功能是ping某一个网段的所有ip,然后将ping的结果提取出来,输出可以ping通的ip以及往返时间。

        初学Python,写得简陋,各位大侠多多指教。

    1. 正则表达式请根据自己的系统进行调整,我这个是中文win7下的结果

    2. Python3.3下测试没问题

    3. ping测试的过程中内存占用较大,不知道可以怎么改进


    __author__ = 'wucl'
    
    import subprocess, re, _thread, queue, time, threading
    
    print('Ping Processing, Please Wait...')
    
    regex=re.compile('最短 = (\d+)ms,最长 = (\d+)ms,平均 = (\d+)ms')
    ipPrefix='192.168.1.'
    decoding='gbk'
    
    def ping(ip):
        p=subprocess.Popen(['ping.exe',ip],stdout=subprocess.PIPE)
        out=p.stdout.read()
        result=regex.findall(out.decode(decoding))
        if result:
            printQueue.put('%15s    最短=%2dms,最长=%2dms,平均=%2dms' %(ip,int(result[0][0]),int(result[0][1]),int(result[0][2])))
            return (ip,result[0])
    
    def resultPrint(printQueue):
        while True:
            try:
                data=printQueue.get()
            except queue.Empty:
                pass
            else:
                with safeprint:
                    print(data)
    
    printQueue=queue.Queue()
    safeprint=_thread.allocate_lock()
    thread=threading.Thread(target=resultPrint,args=(printQueue,))
    thread.daemon=True
    thread.start()
    
    waitfor=[]
    
    for i in range(1,255):
        ip=ipPrefix+str(i)
        thread=threading.Thread(target=ping,args=(ip,))
        waitfor.append(thread)
        thread.start()
    
    for thread in waitfor:
        thread.join()
    
    print('Ping End.')
    input('Press Enter to quit.')


关键字