在python中从文本文件中读取/ ping多个ip地址的问题

时间:2016-04-17 16:12:31

标签: python

我刚开始学习Python并坚持以下问题。 我有一个简单的程序从文本文件中读取IP地址并检查ICMP可达性。当文本文件中只有一个IP地址时,我不会遇到程序问题,但是,一旦我在文本文件中添加了多个IP地址,我的程序就无法运行。看起来有超过1个地址,Windows ping实用程序甚至无法理解IP地址并尝试解析名称。

读取文件并检查ICMP的示例代码:

models.Project.findAll({
    limit: 5,
    attributes: ['Project.*', 'ProjectLikes.id', [models.sequelize.fn('COUNT', models.sequelize.col('ProjectLikes.id')), 'totalLikes']],
    include: [ { model: models.ProjectLikes }],
    group: [ models.Project.rawAttributes.id ]
  })
  .then(function (projects) {
    return res.json(projects);
  });

我有一个包含以下地址的简单文本文件。

4.2.2.2

8.8.8.8

我可以从命令提示符ping这些地址,但不能从程序中ping。

这是我从程序中ping时遇到的错误。

Ping请求找不到主机4.2.2.2 。请检查名称,然后重试。 无法访问文件中的部分或全部IP,请检查并重试

(看起来它并不了解4.2.2.2已经是IP)

一旦我从文本文件中删除第二个地址并再次运行,我就可以ping到4.2.2.2。

2 个答案:

答案 0 :(得分:1)

由于文件中有空格,因此程序中的IP地址无法识别。感谢cdarke提供以下解决方案。

“您可能会在每个IP地址后附加换行符。在subprocess.call中尝试ip.rstrip()”

roadrunner66,我也非常感谢您对此问题的帮助并提供解决方案。

答案 1 :(得分: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