2017-11-30 23 views
1

저는 파이썬에서 LAN 호스트 검색을위한 스크립트를 만들고 있습니다 (scapy yea는 알고 있지만, 학습 경험을 위해 소켓 라이브러리를 사용하려고합니다). 호스트를 발견 할 수 있지만 라이브 응답을 반환하지 않는 호스트에서 라이브 호스트를 분리하는 데 문제가 있습니다. 유일한 표시기는 시간 초과 응답입니다 (ping은 float 또는 None 임). 그러나 ping을 반복 할 수는 없습니다. nontytpe 일 수 있으므로 hasattr을 사용하여 호스트를 검사하려고했지만 빈 사전을 얻습니다. 호스트를 통해 반복 할 수있는 더 좋은 방법이 있습니까? 호스트 목록을 사전으로 만들 수는 있지만 nonetypes를 통해 반복의 문제를 해결하지는 못합니다. 어떤 의견이라도 고맙습니다. 감사합니다. 여기 Nonetype 특성을 가진 목록을 반복하는 방법은 무엇입니까? (파이썬)

`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

, 당신은 제외 동안 어떤 반복 가능한 반복 할 수 있습니다 값 대신 다음 생성기에서 반복하여 값 :

>>> 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 
0
코드를 테스트하지 않고

,하지만 난 당신이 바로, 바로 사용을 이해하는 경우 없음 유형 전년도 확인 "아무도 없다"일반적으로

if ping is not None: 
    live.append(host)