Possible Duplicate:
Wrap subprocess' stdout/stderr像往常一樣,你可以使python子進程輸出stdout和stderr,但也捕獲輸出爲字符串?
在this question,hanan-n問是否有可能有一個python子輸出到標準輸出,同時保持輸出在後處理的字符串。在這種情況下,解決的辦法是遍歷所有的輸出線和手動打印出來:
output = []
p = subprocess.Popen(["the", "command"], stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, ''):
print(line)
output.append(line)
然而,這種解決方案並不能概括要用於stdout和stderr做到這一點的情況下,同時滿足以下:
- 從標準輸出/標準錯誤輸出應該去父進程的標準輸出/標準錯誤分別爲
- 輸出應在儘可能實時地進行(但我只需要訪問字符串以結束)
- o標準輸出和標準錯誤行之間不應該改變(我不太確定,如果子進程以不同的時間間隔刷新它的標準輸出和標準錯誤緩存,那麼它是如何工作的;現在讓我們來,我們得到包含完整線條很好的大塊的一切承擔?)
我通過subprocess documentation看去,卻找不到任何可以做到這一點。我能找到的最接近的是添加stderr=subprocess.stdout
並使用與上述相同的解決方案,但是我們失去了正常輸出和錯誤之間的區別。有任何想法嗎?我猜測解決方案 - 如果有的話 - 將涉及異步讀取到p.stdout
和p.stderr
。
這裏是我想要做什麼的例子:
p = subprocess.Popen(["the", "command"])
p.wait() # while p runs, the command's stdout and stderr should behave as usual
p_stdout = p.stdout.read() # unfortunately, this will return '' unless you use subprocess.PIPE
p_stderr = p.stderr.read() # ditto
[do something with p_stdout and p_stderr]
我不明白這種技術(包裝任何IO函數和流對象)是不是泛化? – ninjagecko
你如何建議我讓子進程實時打印到stdout和stderr,同時仍然在字符串中輸出結果,然後呢? – pflaquerre