2016-04-17 29 views
1

我剛開始學習Python,並遇到以下問題。 我有一個簡單的程序從文本文件讀取IP地址,並檢查ICMP可達性。當文本文件中只有一個IP地址時,我沒有問題,但是,只要我在文本文件中添加了多個IP地址,我的程序就無法工作。它看起來像多於1個地址,windows ping實用程序甚至無法理解IP地址並嘗試解析名稱。從Python中的文本文件讀取/ ping多個IP地址的問題

示例代碼讀取該文件,並檢查ICMP:

def validate_ip(): 
    global ip_add_list 

    check = False 


    while True: 
     try: 

      ip_file = raw_input("Enter the file name and extension:") 
      selected_ip_file = open(ip_file,'r') 
      selected_ip_file.seek(0) 
      ip_add_list = selected_ip_file.readlines() 
      selected_ip_file.close() 

     #print ip_add_list 
     except IOError: 
      print"*File %s doesn't exist, try again" % ip_file 
      continue 
    check2 = False 
    while True: 
     for ip in ip_add_list: 
      print ip 
      ping_reply = subprocess.call(['ping','-n','5','-w','1000','-a',ip]) 
      if ping_reply == 0: 
       check2 = True 
       print "pings completed" 


      else: 
       check2 = False 
       break 
    if check2 == True: 
     break 
    elif check2 == False: 
     print"Some or all ip(s) in the file are not reachable, please check and try again" 
     validate_ip() 

我有以下地址一個簡單的文本文件。

4.2.2.2

8.8.8.8

我可以ping從命令提示符下這些地址,但不是從程序。

這是我從程序中ping出來的錯誤。

Ping請求找不到主機4.2.2.2 。請檢查名稱並重試。 部分或全部IP(S)的文件中都沒有到達,請再試一次

(貌似不明白,4.2.2.2已經是一個IP)

一旦我刪除第二個地址從文本文件中再次運行,我可以ping到4.2.2.2。

+0

您可能會爲每個IP地址附加一個換行符。在'subprocess.call'中試試'ip.rstrip()'。 – cdarke

+0

@cdarke哇!像魅力一樣工作。這讓我瘋狂。讚賞幫助cdarke。有沒有辦法提供讚美以獲得幫助? –

+0

我很樂意提供幫助,您的感謝就夠了。使用從文件中讀取文本時,這種問題很常見,所以我以前使用文件名而不是IP地址來看過它。小竅門:你有一個'print ip' trace語句,當你這樣做時,然後使用'print'<'+ip+'>''。 V形圖顯示周圍是否有空白。將變量嵌入錯誤消息中時也是如此。 – cdarke

回答

0

注意:此問題可能是ping-a-site-in-python的重複。

爲了使代碼可讀,將它變成如下所示的塊。信貸到python-read-file-line-by-line-into-array。 SO問題ping-a-site-in-python也討論了可選的ping方法。

import subprocess 

def validate_ips_from_file(filename): 
    lines = [line.rstrip('\n') for line in open('filename')] 
    validate_ips(lines) 

def validate_ips(ipaddresses): 
     for ip in ipaddresses: 
      ping_reply=validate_ip(ip) 
      print ip, ping_reply 

def validate_ip(ipaddress): 
    ping_reply = subprocess.call(['ping','-c','5','-w','1000','-a',ipaddress]) 
    #https://en.wikipedia.org/wiki/Ping_(networking_utility)  
    return ping_reply 

validate_ips(['www.nytimes.com','www.theregister.co.uk','www.stackoverflow.com']) 

輸出:

www.nytimes.com 1 
www.theregister.co.uk 1 
www.stackoverflow.com 1 
1

由於文件中的空格,IP地址不鑑定的程序有效。感謝cdarke提供下面的解決方案。

「您可能必須附加到每個IP地址一個換行符。在subprocess.call嘗試ip.rstrip()」

roadrunner66,我也很欣賞這個問題您的幫助和提供的解決方案。