2011-12-13 57 views
0
# cmd = "python subscript.py" 
cmd = "ping localhost -n 10" 
ofile =open("C:\file.log","w") 
sp = subprocess.Popen(cmd,bufsize = 1, stdout = subprocess.PIPE, stderr = subprocess.PIPE) 

while True: 
    sp.poll() 
    line = sp.stdout.readline() 
    #eline = sp.stderr.readline() 
    if line: 
     print line 
     ofile.write(line) 
    #if eline: 
     # print eline 
     # ofile.write(" ERROR: "+line) 
    # if (line == "" and eline == ""): 
    if (line == ""): 
     break 

私はサブプロセスから出力を取得し、上記のコードを使用してログファイルに保存しようとしています。それはping localhost -n 10のためにうまくいきます。しかし、subscript.pyを呼び出すためにそれを使用すると、subscript.pyの出力をリアルタイムで得ることができません。私はsubscript.pyの終了後にすべての出力を得るでしょう。なにか提案を?また、私はそれを動作させるためにeline = sp.stderr.readline()をコメントアウトする必要があります。なぜいくつかのコードは私にsubscript.pyのリアルタイム出力を与えないだろうか?Popenからリアルタイム出力を取得

subscript.py:

import time 
i=0 
while (i<5): 
    time.sleep(1) 
    i += 1 
    print "ouput:",i 

ルービックは前に尋ねた夫婦同様の質問があります述べたように。私は見つけたものすべてを試してみて、誰も私の問題を解決しませんでした。いくつかの理由は、subscript.pyを呼び出すときに動作しない理由を指すことを願っています。

編集: ここに問題があります:subscript.pyの出力は、自身が終了するまでフラッシュされませんでした。 subscript.pyにはstderrがないため、sp.stderr.readline()を呼び出すと無限の待機が発生します。 ソリューション: すべてのstderrのサブスクリプトの の出力をフラッシュします。stderr = subprocess.STDOUTを使用してstdoutにリダイレクトします。

+0

可能な重複:http://stackoverflow.com/questions/803265/getting-realtime-output-using-subprocess – rubik

+0

他の重複:http://stackoverflow.com/questions/1085071/real-time-intercepting-of -stdout-from-other-process-in-pythonです。実際には重複した*がたくさんあります。検索するだけです。 http://stackoverflow.com/questions/527197/intercepting-stdout-of-a-subprocess-while-it-is-running – rubik

+0

私は検索し、私がstackoverflowで見つけたすべてのコードを試しました。ここの鍵は、2番目のpythonスクリプトを呼び出すときに同じコードがうまくいかないことです。 – wang

答えて

2

printステートメントの後にサブプロセスでsys.stdout.flush()を呼び出してみましたか?出力バッファリングを実行している可能性があります。

+0

はい私はそれを結びましたが、それは行きません。何らかの理由で、subscript.pyの終了後にすべての出力が表示されます – wang

+0

あなたは間違っています。 subscript.pyのprint文の後にsys.stdout.flush()を呼び出そうとしました。 – wang