2012-01-24 16 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

'timeout'は方程式の半分に過ぎないことに注意してください。 OPの元の例のように、 'lifetime'も使われるべきです。 http://comments.gmane.org/gmane.comp.python.dnspython.user/144を参照してください。 –

関連する問題