2016-04-17 6 views
1

私はちょうどPythonを学び始めて、次の問題を抱えています。 私は、テキストファイルからIPアドレスを読み込み、ICMP到達可能性をチェックする簡単なプログラムを持っています。テキストファイルに1つのIPアドレスがある場合、プログラムに問題はありませんが、テキストファイルに2つ以上のIPアドレスを追加するとすぐにプログラムが機能しません。それは1つ以上のアドレスのように見える、窓pingユーティリティはIPアドレスを理解することさえできず、名前を解決しようとする。Pythonのテキストファイルから複数のIPアドレスを読み取る/発行する問題

サンプルコードファイルを読み込み、ICMPをチェックする:

def validate_ip(): 
    global ip_add_list 

    check = False 


    while True: 
     try: 

      ip_file = raw_input("Enter the file name and extension:") 
      selected_ip_file = open(ip_file,'r') 
      selected_ip_file.seek(0) 
      ip_add_list = selected_ip_file.readlines() 
      selected_ip_file.close() 

     #print ip_add_list 
     except IOError: 
      print"*File %s doesn't exist, try again" % ip_file 
      continue 
    check2 = False 
    while True: 
     for ip in ip_add_list: 
      print ip 
      ping_reply = subprocess.call(['ping','-n','5','-w','1000','-a',ip]) 
      if ping_reply == 0: 
       check2 = True 
       print "pings completed" 


      else: 
       check2 = False 
       break 
    if check2 == True: 
     break 
    elif check2 == False: 
     print"Some or all ip(s) in the file are not reachable, please check and try again" 
     validate_ip() 

私は、次のアドレスを持つ単純なテキストファイルを持っています。

4.2.2.2

8.8.8.8

私は、コマンドプロンプトから、しかしないプログラムからこれらのアドレスに対してpingを実行することができます。

これは、プログラムからpingを実行中に発生するエラーです。

Ping要求でホスト4.2.2.2 が見つかりませんでした。名前を確認してもう一度お試しください。 一部またはすべてのIP(S)ファイルには、チェックして、もう一度

を試してみてください、到達できないとすぐに私は削除

を(4.2.2.2がすでにIPであること、それは理解していないように見えます)テキストファイルから2番目のアドレスを指定して再度実行すると、4.2.2.2にpingすることができます。

+0

各IPアドレスに改行が付加されていることがあります。 'subprocess.call'で' ip.rstrip() 'を試してください。 – cdarke

+0

@cdarkeうわー!魅力的に働いた。これは私を夢中にさせていた。ヘルプcdarkeを高く評価しました。助けを贈る方法はありますか? –

+0

私は助けてうれしいです、あなたの感謝は十分です。この種の問題は、ファイルから読み込んだテキストを使用する場合によく起こるので、IPアドレスではなくファイル名で前に見ました。ヒント:あなたは 'print ip'というトレース文を持っています。すると、' print 'のようなものを使ってください。<'+ip+'>' 'シェブロンは、周囲に空白があるかどうかを示します。エラーメッセージの中に変数を埋め込むときも同じです。 – cdarke

答えて

0

注::この質問はおそらくping-a-site-in-pythonと重複しています。

コードを読み取り可能にすると、以下のようなチャンクに変換できます。信用度はpython-read-file-line-by-line-into-arrayです。 SOの質問ping-a-site-in-pythonでは、pingの別の方法についても説明しています。

import subprocess 

def validate_ips_from_file(filename): 
    lines = [line.rstrip('\n') for line in open('filename')] 
    validate_ips(lines) 

def validate_ips(ipaddresses): 
     for ip in ipaddresses: 
      ping_reply=validate_ip(ip) 
      print ip, ping_reply 

def validate_ip(ipaddress): 
    ping_reply = subprocess.call(['ping','-c','5','-w','1000','-a',ipaddress]) 
    #https://en.wikipedia.org/wiki/Ping_(networking_utility)  
    return ping_reply 

validate_ips(['www.nytimes.com','www.theregister.co.uk','www.stackoverflow.com']) 

出力:ファイル内の空白に

www.nytimes.com 1 
www.theregister.co.uk 1 
www.stackoverflow.com 1 
1

、IPアドレスは、プログラム内の有効な同定されませんでした。以下のソリューションを提供してくれたcdarkeに感謝します。 「あなたは、各IPアドレスに追加改行を持っているかもしれません。(ip.rstripを試してみてくださいsubprocess.callで)」

roadrunner66、私はまた、この問題であなたの助けに感謝し、解決策を提供します。

関連する問題