2012-01-24 26 views
7

我有一個小腳本,檢查他們的MX記錄的大型域名列表,一切正常,但當腳本找到一個沒有記錄的域時,需要相當長的時間才能跳到下一個。Dnspython:設置查詢超時/生命週期

我曾嘗試加入:

query.lifetime = 1.0 
or 
query.timeout = 1.0 

,但是這似乎並沒有做任何事情。有誰知道這個設置是如何配置的?

我的腳本在下面,謝謝你的時間。

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

回答

15

你後設置超時你已經進行了查詢。所以這不會做任何事情!

你想要做的,而不是什麼是創建一個Resolver對象,設置超時,然後調用它的query()方法。 dns.resolver.query()只是一個便利功能,它可以實例化一個默認的Resolver對象並調用它的query()方法,所以如果您不需要默認的Resolver,則需要手動執行此操作。

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

然後在循環使用:

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

您應該能夠使用相同的Resolver對象爲所有查詢。

+3

非常感謝你!我用超時的方式嘗試了你的答案,但仍然有同樣的問題,但是使用resolver.lifetime = 1.0工作。 –

+1

是的,我真的不知道有什麼區別(從來沒有使用過這個庫),但我很高興你找到了正確的屬性。 – kindall

+0

請注意,「超時」只是方程的一半。正如在OP最初的例子中,也應該使用'lifetime'。請參閱http://comments.gmane.org/gmane.comp.python.dnspython.user/144 –