2017-02-09 17 views
2

私は完了しようとしたスクリプトの一部を切りました。各反復の後にmylineS.split()[0]の新しい結果が出ることを期待しています。 outS.txtおよびoutT.txtは、各反復ごとにcommandCの結果であり、結果は反復ごとに異なります。しかし、mylineS.split()[0]は各反復ごとに最初の結果を返します。whileループ中のopen文で何かが間違っています

私のアプローチで何か間違っていると思いますか?

B = 0 
while B < len(Source_Tdevs): 
    devS = Source_Tdevs[B] 
    devT = Target_Tdevs[B] 
    subprocess.run(commandC, shell=True) 
    print (devS) 
    with open('outS.txt', 'r') as gS: 
     CS = len(gS.readlines()) 
     mylineS = linecache.getline('outS.txt', CS -1) 
     Source_Tdevs_SGs.append(mylineS.split()[0]) 
     **print (mylineS.split()[0])** 
     gS.close() 
    with open('outT.txt', 'r') as gT: 
     CT = len(gT.readlines()) 
     mylineT = linecache.getline('outT.txt', CT - 1) 
     Target_Tdevs_SGs.append(mylineT.split()[0]) 
     gT.close() 
    subprocess.run('del outS.txt, outT.txt', shell=True) 
    B= B + 1 

コマンドCは、subprocess.run(commandC, shell=True)の1行上です。私は底を書いています。

commandC = 'set "SYMCLI_OFFLINE=1" & set "SYMCLI_DB_FILE=C:\PROGRAM FILES\EMC\SYMAPI\DB\SYMAPI_DB.BIN" & call symaccess -sid %s list -type storage -dev %s > outS.txt & call symaccess -sid %s list -type storage -dev %s > outT.txt' % (
     sid, devS, sid, devT) 
+2

あなたは(オープンで使用する場合、ファイルをクローズする必要はありません)。 –

答えて

0

あなたはlinecacheモジュールを乱用しています。 linecacheはPythonのソースコードからソースコードの行を取得するために使用されることを意味している。

linecacheモジュールは、キャッシュを使用して、内部的に最適化しようとしたときに、1は、Pythonのソースファイルから任意の行を取得することができ、 1つのファイルから多くの行が読み込まれる一般的なケースです。これは、トレースバックモジュールがフォーマットされたトレースバックに含めるソース行を取得するために使用されます。

テキストには、ファイルの内容もメモリに保持されているため、最初の実行時にのみ正しい出力が得られます。簡単な救済策は行うには良いものがないになりますが(それは、このためのものではなく、あなたのファイルは常に後に変更されているすべてのlinecacheを使用

linecache.checkcache('outS.txt') 

を使用してキャッシュを無効にすることですすべて);だけではなく、.readlines()を使用して内のすべての行を読んで、例えば、[-1]で最後を抽出:

lines = gS.readlines() 
last_line = lines[-1] 
+0

お返事ありがとうございました。私はプログラマーではなく、Pythonを学ぼうとしています。あなたは答えがとても役に立ちました。私は問題を解決しました。 – user7528506

+0

@ user7528506通常は、事故によってラインキャッシュモジュールを経由することはありません。 Stack Overflowに関するアドバイスを受けましたか?その場合、プログラムの実行中に内容が変更されることが予想されるファイルから行を読み込むために 'linecache'を使うべきではないことを私はコメントしています。 –

+0

おそらく私はそれをどこかで見つけたが、長い時間前に、ソースを覚えていない。私は古いスクリプトでそれを使用し、現時点でそこからコピーしました。 – user7528506

関連する問題