2011-01-06 26 views
4

我目前正在重寫一個我曾經用C++編寫的python中的小包裝程序。它從一個文件中提取文件並以另一種格式將它們裝箱。subprocess.popen()的實時輸出,而不是一行一行

在C++中,我需要運行的系統命令的輸出是「實時」,即狀態欄和實時顯示的某些命令的百分比指示符。使用python,我可以將每個「百分比」單獨放在屏幕上(因爲我一行一行地閱讀它)。下面是一個例子:多數民衆贊成在一個狀態欄看起來在python版本(這一直持續到100)。在C++中,它確實會自行更新。

| (02/100)\rImporting AVC-H264: |     | (03/100)\rImporting AVC-H264: |      | (04/100)\rImporting AVC-H264: |= 

那相應的Python代碼:

p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
for line in iter(p.stdout.readline, ""): 
    print line, 

上我怎麼可能使它看起來像在C++中的任何想法?

回答

6

可能是兩件事情......

這可能是因爲Readline正從 程序的輸出改變一些事情。我相信\r是回車,並告訴終端 返回到 行的開頭,然後程序可以輸出超過剛剛輸出的文本。 Readline是最有可能消除這一點。

首先要嘗試,

p = subprocess.Popen(args, stdout=subprocess.PIPE, \ 
        stderr=subprocess.PIPE, \ 
        universal_newlines=True) 
for line in iter(p.stdout.readline, ""): 
    sys.stdout.write('\r'+line[:-1]) 
    sys.stdout.flush() 

這樣做,因爲標準輸出緩衝區,直到它得到一個\n和 當然你不寫一個沖洗。

+0

感謝您的答案。我玩這個解決方案,我認爲它必須是沿着這個線: 而1: data = p.stdout.read() sys.stdout.write(data) #過程完成所以打破 如果p.returncode不是無: 中斷 問題是,現在它在屏幕上立即轉儲所有內容,但在彼此之下,它仍然不會覆蓋自己。 我無法理解p.stdout.read()返回的內容。它決定哪些點「這就是我要回來」? – Basil 2011-01-07 21:18:11

0

很抱歉,但我不明白還有實時的一部分,但也許我可以用「更新自我」部分幫助,試試這個:

for line in iter(p.stdout.readline, ""): 
    print line + '\r', 
1

在Windows上,可以輸出退格字符( ASCII碼8)。示例(打印僅使用單個數字的當前迭代):

>>> import time 
>>> import sys 
>>> for i in xrange(10): 
...  sys.stdout.write(str(i)) 
...  time.sleep(.5) 
...  sys.stdout.write(chr(8)) 
... 

你會需要跟蹤當前行的字符數的......我敢肯定,必須有一個更好的辦法。

在Linux上,看起來您可以編寫回車符來重置光標位置。見Erase the current printed console lineIn-place progress output in the terminal or console

+0

我想你可以不知道字符的數量,因爲從父進程的輸出始終是相同的長度,據我所知。 – milkypostman 2011-01-07 23:07:24

相關問題