2016-12-04 38 views
1

我需要逐行讀取使用回車符(\r)進行輸出的程序的輸出。該程序運行很長時間,所以我需要在程序運行時讀取輸出。我知道如何做到這一點,當每個輸出項目出現在一個新的行(詳細here),但我似乎無法讓它與回車工作。從子進程讀取回車定界輸出

這裏是我曾經嘗試並獲得它的工作代碼(在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") 

然而,代碼只是立即退出,打印Done

我想要的代碼打印:

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

等什麼我需要修改,以得到這個工作?

回答

1

如果您想通過字節得到的字節,你需要傳遞的字節數去read method

c = out.read(1) 

否則,它會讀取全部內容。

+0

就是這樣。謝謝!我很快就會接受。 – DonyorM

+0

要一行一行地讀取輸出,是不是想用'輸入輸出:'? – martineau

+0

@martineau因爲它是由回車而不是換行符分隔的。你知道一些終端程序(如apt-get的進度條)如何更新該行。我正在處理一個這樣的程序。 – DonyorM