我刚刚开始学习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这些地址。
这是我从程序pinging时得到的错误。
Ping请求找不到主机4.2.2.2。请检查名称,然后重试。文件中的部分或全部ip不可访问,请检查并重试
(看起来好像不明白4.2.2.2已经是IP了)
只要我从文本文件中删除第二个地址并再次运行,我就能够ping通4.2.2.2。
发布于 2016-04-20 13:53:49
由于文件中存在空格,IP地址在程序中无法识别为有效地址。感谢cdarke提供了下面的解决方案。
“您可能会在每个IP地址后追加一个换行符。在subprocess.call中尝试ip.rstrip()”
roadrunner66,我也很感谢你在这个问题上的帮助和提供的解决方案。
发布于 2016-04-18 00:55:36
注意:这个问题很可能是ping-a-site-in-python的翻版。
要使代码具有可读性,请将其转换为如下所示的块。归功于python-read-file-line-by-line-into-array。SO question 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 1https://stackoverflow.com/questions/36678957
复制相似问题