我必須忽略一些非常明顯的東西。我需要執行一個C程序,實時顯示它的輸出,並最終解析它的最後一行,這應該是直接的,因爲最後一行打印爲總是一樣。無緩衝的子流程輸出(最後一行缺失)
process = subprocess.Popen(args, shell = True,
stdout = subprocess.PIPE, stderr = subprocess.PIPE)
# None indicates that the process hasn't terminated yet.
while process.poll() is None:
# Always save the last non-emtpy line that was output by the child
# process, as it will write an empty line when closing its stdout.
out = process.stdout.readline()
if out:
last_non_empty_line = out
if verbose:
sys.stdout.write(out)
sys.stdout.flush()
# Parse 'out' here...
但是,偶爾會出現最後一行不打印。 Popens的bufsize的默認值爲0,所以它應該是無緩衝的。我也嘗試過,在退出之前將C++代碼加入fflush(標準輸出),但似乎在退出程序之前絕對不需要刷新流。
想法任何人?
如果子進程生成足夠的輸出來填充其OS管道緩衝區,則子進程掛起。除非您從管道讀取數據,否則不要使用PIPE。你可以使用'deque(iter(process.stdout.readline,b''),maxlen = 1).pop()'來獲得最後一行。或[逐行讀取:'在iter中的行(process.stdout.readline,b''):...'](http://stackoverflow.com/a/17698359/4279) – jfs 2014-09-21 16:12:39