好吧,所以我見過這麼多的線程,但沒有一個給出了完整的答案,我試過的所有東西迄今爲止都不適用於我。使用subprocess.Popen調用python腳本並刷新數據
1)的腳本不斷輸出一些數據和flusheshs它:
import time
import sys
if __name__ == '__main__':
for i in range(5):
print i,
sys.stdout.flush()
time.sleep(1)
2)腳本調用第一個腳本與POPEN,應由之一,但由於某些原因沒有被印刷的數字之一,並將它們打印產品總數一次:
import sys
import subprocess
if __name__ == '__main__':
process = subprocess.Popen(['python', 'flush.py'], stdout = subprocess.PIPE)
for line in iter(process.stdout.readline, ''):
print line,
sys.stdout.flush()
第一件事,我很困惑一點點在第一腳本是,如果你刪除刷新它返回輸出在一行一起O_O ...我非常確定這是因爲time.sleep,但仍然有點期望它返回像一個標準輸出不斷返回值0,1,2 ,3,4但不是全部一起着,當然沖洗解決它,只是奇怪,至少對我來說...
的主要問題: 那是第二個腳本沒有一個返回一個數字,但回報所有在一個輸出一次.....我需要的是看到數字一個接一個彈出...
我讀了一個地方,它不返回EOF,Popen等待關閉管道,這就是爲什麼它運行喜歡結束.....
那麼我該怎麼做或接下來嘗試? 在此先感謝。
很可能是因爲您的子流程在每個數字後都沒有打印換行符。 'readline'讀取直到換行符(或文件結尾)。看看我的答案在這裏是否有所幫助:http://stackoverflow.com/questions/12255802/having-difficulty-capturing-output-of-a-subprocess-that-does-in-place-status-upd/12256356#12256356 –
那麼,基本上我找到了解決我的問題。雖然我沒有真正理解它背後的理論,但代碼是有效的[link](http://chase-seibert.github.com/blog/2012/11/16/python-subprocess-asynchronous-read-stdout的.html)。爲什麼你在線程中執行它,在某處我讀取不阻止主線程,但接下來又是如何提供幫助,如果仍然只是在線程中將整個文本集中在一起,那對我來說沒有意義,因爲我不明白它是如何實現的我猜的作品。那麼關於將文件描述符設置爲非阻塞的問題也會讓我感到困惑。 – Viktor
@Viktor:[您提供的鏈接](http://chase-seibert.github.com/blog/2012/11/16/python-subprocess-asynchronous-read-stdout.html)是不必要的複雜。它的工作原理是因爲它不使用'readline()'(對於非阻塞管道來說不起作用),因此它不會等待子腳本永遠不會生成的換行符。這裏有一個[更簡單的解決方案,在很多情況下應該足夠用於面向行的輸出](http://stackoverflow.com/a/17698359/4279) – jfs