1

このスクリプトが以前にここで説明されたことは知っていますが、まだ正しく実行できません。問題は、テキスト ファイルを 1 行ずつ読み取ることです。古いスクリプトでは

while host:
  print host  

が使用されていましたが、このメソッドを使用するとプログラムがクラッシュしたため、変更することにしました

for host in Open_host:
host = host.strip()

ただし、このスクリプトを使用すると、.txt ファイルの最後の行の結果しか得られません。誰かがそれを機能させるのを手伝ってくれますか? 以下のスクリプト:

# import subprocess
import subprocess
# Prepare host and results file
Open_host = open('c:/OSN/host.txt','r')
Write_results = open('c:/OSN/TracerouteResults.txt','a')
host = Open_host.readline()
# loop: excuse trace route for each host
for host in Open_host:
host = host.strip()
# execute Traceroute process and pipe the result to a string 
   Traceroute = subprocess.Popen(["tracert", '-w', '100', host],  
 stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
   while True:    
       hop = Traceroute.stdout.readline()
       if not hop: break
       print '-->',hop
       Write_results.write( hop )
   Traceroute.wait()  
# Reading a new host   
   host = Open_host.readline()
# close files
Open_host.close()
Write_results.close() 
4

1 に答える 1

0

ファイルには 2 つまたは 3 つのホストしかないと思いhost.txtます。犯人はOpen_host.readline()、ループの前と各反復の最後に行う呼び出しであり、スクリプトがリストの最初のホストと 2 つのうちの 1 つのホストをスキップします。それらを削除するだけで問題が解決するはずです。

よりPythonicになるように少し更新されたコードは次のとおりです。

import subprocess

with open("hostlist.txt", "r") as hostlist, open("results.txt", "a") as output:
    for host in hostlist:
        host = host.strip()

        print "Tracing", host

        trace = subprocess.Popen(["tracert", "-w", "100", host], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

        while True:
            hop = trace.stdout.readline()

            if not hop: break

            print '-->', hop.strip()
            output.write(hop)

        # When you pipe stdout, the doc recommends that you use .communicate()
        # instead of wait()
        # see: http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait
        trace.communicate()
于 2014-03-19T09:18:09.333 に答える