我刚开始学习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。
答案 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