2012-01-24 15 views
7

Mam mały skrypt, który sprawdza dużą listę domen dla ich rekordów MX, wszystko działa poprawnie, ale gdy skrypt znajdzie domenę bez rekordu, przeskoczenie do Następny.Dnspython: Ustawianie limitu czasu kwerendy/okresu ważności

Próbowałem dodając:

query.lifetime = 1.0 
or 
query.timeout = 1.0 

ale to nie wydaje się nic zrobić. Czy ktoś wie, jak to ustawienie jest skonfigurowane?

Mój scenariusz znajduje się poniżej, dzięki za poświęcony czas.

import dns.resolver 
from dns.exception import DNSException 
import dns.query 
import csv 

domains = csv.reader(open('domains.csv', 'rU')) 
output = open('output.txt', 'w') 
for row in domains: 
    try: 
     domain = row[0] 
     query = dns.resolver.query(domain,'MX') 
     query.lifetime = 1.0 
    except DNSException: 
     print "nothing here" 
    for rdata in query: 
      print domain, " ", rdata.exchange, 'has preference', rdata.preference 
      output.writelines(domain) 
      output.writelines(",") 
      output.writelines(rdata.exchange.to_text()) 
      output.writelines("\n") 

Odpowiedz

15

Ty ustawienie limitu czasu po już przeprowadzono kwerendę. Więc nic nie da!

Co chcesz zrobić, to zamiast tworzyć Resolver obiekt, ustaw jego czas oczekiwania, a następnie wywołać jego metodę query(). dns.resolver.query() to tylko wygodna funkcja, która tworzy instancję domyślną obiektu Resolver i wywołuje jego metodę query(), więc musisz to zrobić ręcznie, jeśli nie chcesz mieć domyślnego Resolver.

resolver = dns.resolver.Resolver() 
resolver.timeout = 1 
resolver.lifetime = 1 

Wtedy to wykorzystać w pętli:

try: 
    domain = row[0] 
    query = resolver.query(domain,'MX') 
except: 
    # etc. 

Powinieneś być w stanie korzystać z tego samego Resolver obiekt dla wszystkich zapytań.

+3

Dziękuję bardzo !, Próbowałem twojej odpowiedzi z limitem czasu, ale wciąż miałem ten sam problem, ale używanie resolver.lifetime = 1.0 działało. –

+1

Tak, nie jestem naprawdę pewien, na czym polega różnica (nigdy nie korzystałem z tej biblioteki), ale cieszę się, że znalazłeś odpowiedni atrybut. – kindall

+0

Należy zauważyć, że 'timeout' jest tylko połową równania. Podobnie jak w oryginalnym przykładzie OP, należy również użyć terminu "czas życia". Zobacz http://comments.gmane.org/gmane.comp.python.dnspython.user/144 –