繁体   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