2012-01-24 9 views
7

Tengo un pequeño script que comprueba una gran lista de dominios para sus registros MX, todo funciona bien, pero cuando el script encuentra un dominio sin registro, se tarda bastante tiempo en saltar a el siguiente.Dnspython: configuración de tiempo de espera/consulta de consulta

He intentado añadir:

query.lifetime = 1.0 
or 
query.timeout = 1.0 

pero esto no parece hacer nada. ¿Alguien sabe cómo se configura esta configuración?

Mi script está debajo, gracias por su tiempo.

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

Respuesta

15

está configurando el tiempo de espera después de que ya haya realizado la consulta. ¡Así que eso no va a hacer nada!

Lo que se quiere hacer en su lugar es crear un objeto Resolver, establecer su tiempo de espera, y luego llamar a su método query(). dns.resolver.query() es solo una función de conveniencia que instancia un objeto predeterminado Resolver e invoca su método query(), por lo que debe hacerlo manualmente si no desea un valor predeterminado Resolver.

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

A continuación, utilice esto en su bucle:

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

usted debería ser capaz de utilizar la misma Resolver objeto para todas las consultas.

+3

¡Muchas gracias !, intenté su respuesta con tiempo de espera, pero todavía tenía el mismo problema, pero el uso de resolvió.lifetime = 1.0 funcionó. –

+1

Sí, no estoy seguro de cuál es la diferencia (nunca usé esa biblioteca) pero me alegro de que haya encontrado el atributo correcto. – kindall

+0

Tenga en cuenta que 'timeout' es solo la mitad de la ecuación. Como en el ejemplo original de OP, también se debe usar 'lifetime'. Ver http://comments.gmane.org/gmane.comp.python.dnspython.user/144 –

Cuestiones relacionadas