我正在用Python创建一个用于LAN主机发现的脚本(我知道没有scapy,尝试使用套接字库来获得学习体验)。我能够发现主机但是在将实时主机与没有响应的主机分开时遇到了麻烦,因为我唯一的指示是超时响应(ping,浮动或无),但是我不能迭代ping它可以是一个nontytpe所以我试图使用hasattr检查主机,但我得到一个空字典。有没有更好的方法可以遍历主机?我可以使主机列表成为字典,但这并不能解决迭代非类型的问题。任何意见都表示赞赏,谢谢。
`if __name__ == '__main__':
live = []
livee = []
for host, ping in multi_ping_query(subnet).iteritems():
subnet = host, '=', ping
print(subnet)
live.append(subnet)
for ping in live:
check = hasattr(ping, 'Nonetype')
if check == False:
livee.append(host)
print(livee)
这是multi_ping_query的函数,我尝试调整它以返回一个字符串,如果它没有连接但是我也没有太大的成功。
def multi_ping_query(hosts, timeout=1, step=512, ignore_errors=False):
results, host_list, id = {}, [], 0
for host in hosts:
try:
host_list.append(socket.gethostbyname(host))
except socket.gaierror:
results[host] = None
while host_list:
sock_list = []
for ip in host_list[:step]: # select supports only a max of 512
id += 1
sock_list.append(PingQuery(ip, id, timeout))
host_list.remove(ip)
# use timeout
asyncore.loop(timeout)
for sock in sock_list:
results[sock.get_host()] = sock.get_result()
return results
答案 0 :(得分:0)
不测试您的代码,但如果我理解您正确,只需使用“is None”再次检查无类型:
if ping is not None:
live.append(host)
答案 1 :(得分:0)
通常,您可以通过迭代以下生成器来迭代任何iterable,同时排除None
值:
>>> iterable = [1, None, 2, 3, None]
>>> iterable_nonone = (x for x in iterable if x is not None)
>>> for x in iterable_nonone:
... print(x)
...
1
2
3