2017-11-30 1 views
1

Ich mache ein Skript für LAN-Host-Erkennung in Python (ohne Scapy ja ich weiß, versucht, die Sockets-Bibliothek für eine Lernerfahrung zu verwenden). Ich bin in der Lage, Hosts zu finden, habe aber Probleme, die Live-Hosts von denen zu trennen, die keine Antwort zurückgaben, weil der einzige Indikator, den ich habe, die Timeout-Antwort ist (ping, was entweder ein float oder None ist), aber ich kann ping nicht iterieren kann ein Untyp sein, also habe ich versucht, hasattr zu verwenden, um die Hosts zu überprüfen, aber ich bekomme ein leeres Wörterbuch. Gibt es einen besseren Weg, wie ich durch die Hosts iterieren kann? Ich kann die Liste der Hosts zu einem Wörterbuch machen, aber das löst nicht das Problem der Iteration durch Nicht-Typen. Jede Eingabe ist dankbar, danke. HierWie durchläuft man eine Liste mit einem Nonetype-Attribut? (Python)

`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) 

ist die Funktion für multi_ping_query habe ich versucht, Tweaking es einen String zurück, wenn es jedoch nicht, schließe ich auch nicht mit so viel Erfolg hatte.

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 

Antwort

0

In der Regel können Sie jede iterable iterieren unter Ausschluss None Werte durch Iterieren über den folgenden Generator stattdessen:

>>> 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

Ohne Code zu testen, aber wenn ich Sie richtig verstanden, benutzen Sie einfach „ist keine“ agains ein None Art zu überprüfen:

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