2013-04-10 9 views
5

私は実行可能ファイルを呼び出すpythonスクリプトを持っています。実行可能ファイルの出力は、呼び出された時刻に関する情報と共にログファイルにリダイレクトされます。たとえば、実行可能ファイルとしてpython -Vを使用しては説明する:ファイルへのサブプロセスstdoutが順序どおりに書き込まれないのはなぜですか?

import time, subprocess 
with open('./LOGFILE.txt', 'a') as F: 
    F.write('******\n') 
    F.write('Events on %s :\n'%time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) 
    EXE_output = subprocess.call(['python', '-V'], stdout=F, stderr=F) 

ファイルLOGFILE.txtの出力は次のように私はそれを期待していた

Python 2.7.3 
****** 
Events on 2013-04-10 19:27:25 : 

****** 
Events on 2013-04-10 19:27:25 : 
Python 2.7.3 

私が書きましたサブプロセスを実行してその出力とエラーをファイルにリダイレクトする前に、開かれたログファイル内の******と時刻情報。なぜそれは注文ですか?どのように並べ替えることができますか?

+0

サブプロセスを実行する前にF.flush()を試してください。 – gcbirzan

+0

Worked!ちょっと説明して答えとして投稿できますか? – amyassin

答えて

6

サブプロセスを実行する前にF.flush()を呼び出す必要があります。この理由は、サブプロセスが完了したらバッファをフラッシュし、そうでない場合はバッファをフラッシュします。

+0

私は正しい順序で書いていましたが、実際にはサブプロセスプロセスが私の前にディスクにデータを取得していましたか? – amyassin

+1

技術的には、データはプロセス特有のユーザー空間バッファからフラッシュされました。カーネルはそうではありません。プロセスが終了するとバッファがフラッシュされるので、データが同じ順序でディスクに確実に到達するようにするには、フラッシュする必要があります。 – gcbirzan

+3

プロセスからオペレーティングシステムにデータを移動するのは高価な操作なので、Cライブラリはプロセス内のデータをバッファして書き込み頻度を減らします。サブプロセスが終了すると、そのclibはデータをオペレーティングシステムにフラッシュしましたが、親プロセスは引き続きそのデータをローカルに保持していました。オペレーティングシステムの観点からは、サブプロセスが最初に書きました。 – tdelaney

関連する問題