2016-12-04 9 views
1

キャリッジリターン(\r)を使用してその出力を行うプログラムの出力を1行ずつ読み込む必要があります。プログラムは長い間実行されるので、プログラムの実行中に出力を読み取る必要があります。私は出力の各項目が新しい行(詳細はhere)に表示されるときにこれを行う方法を知っていますが、キャリッジリターンでは機能しないようです。コードは単にDoneを印刷し、直ちに終了しかしここでサブプロセスからキャリッジリターンで区切られた出力を読む

は、私が試してみて、それを動作させるために使用されるコード(Linuxシステム上で実行)

import subprocess 

command = ["printf", "".join(["Return count: " + str(x) + "\\r" for x in range(10)]) + "\n"] 
proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
buf = bytearray() 
out = proc.stdout 
while True: 
    c = out.read() 
    if c == b"": 
     break 
    if c == "\r": 
     print(buf) 
     buf = bytearray() 
    else: 
     buf += c 

print("Done") 

です。

私はコードを印刷したい:

Return code: 1 
Return code: 2 
Return code: 3 

など私はこの作業を取得するために変更する必要がありますか?

答えて

1

あなたはread methodを取得するバイト数を渡す必要がバイト単位で取得したい場合:

c = out.read(1) 

それ以外の場合は、全体の内容を読み取ります。

+0

それでした。ありがとう!私はまもなく受け入れます。 – DonyorM

+0

出力を行単位で読み取るには、 'for line in out:'を使用しませんか? – martineau

+0

@martineau改行ではなく改行で区切られているためです。どのターミナルプログラム(apt-getの進行状況バーなど)がその行を更新するかを知っています。私はそれを行うプログラムを扱っています。 – DonyorM

関連する問題