簡體   English   中英

從python中的文本文件讀取/ping多個IP地址的問題

[英]Issue with reading/pinging multiple ip address from text file in python

我剛開始學習 Python 並遇到以下問題。 我有一個簡單的程序可以從文本文件中讀取 IP 地址並檢查 ICMP 的可達性。 當文本文件中只有一個 IP 地址時,我的程序沒有問題,但是,一旦我在文本文件中添加了 1 個以上的 IP 地址,我的程序就無法運行。 看起來有 1 個以上的地址,windows 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 無法訪問,請檢查並重試

(貌似看不懂4.2.2.2已經是IP了)

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

由於文件中有空格,程序中未識別出 IP 地址有效。 感謝 cdarke 提供以下解決方案。

“您可能在每個 IP 地址后附加了一個換行符。在 subprocess.call 中嘗試 ip.rstrip()”

roadrunner66,我也很感謝您對此問題的幫助並提供解決方案。

注意:此問題可能與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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM