2009-06-08 125 views
16

我試圖從管道讀取線路並處理它們,但我正在做一些愚蠢的事情,我無法弄清楚什麼。生產者將要無限期地保持生產線,像這樣:Python - 簡單的讀管道從管道

producer.py

import time 

while True: 
    print 'Data' 
    time.sleep(1) 

消費者只需要定期檢查線路:

consumer.py

import sys, time 
while True: 
    line = sys.stdin.readline() 
    if line: 
     print 'Got data:', line 
    else: 
     time.sleep(1) 

當我在Windows shell中以python producer.py | python consumer.py的形式運行它時,它只是永遠睡眠(似乎永遠不會獲取數據?)似乎可能問題在於生成ucer永遠不會終止,因爲如果我發送有限數量的數據,那麼它工作正常。

如何獲取要接收的數據並顯示給消費者?在實際應用中,製作者是我無法控制的C++程序。

回答

16

一些老版本的Windows通過文件模擬管道(所以他們很容易出現這樣的問題),但這在10多年以前一直沒有問題。嘗試print後加入

sys.stdout.flush() 

的製片人,也儘量讓生產者的stdout無緩衝(通過使用python -u)。

當然,如果你對生產者沒有控制權的話,這並沒有什麼幫助 - 如果它緩衝了太多的輸出,你仍然要等很長時間。

不幸的是 - 雖然有解決在類Unix的操作系統,如pyexpect,pexpectexscriptparamiko這個問題很多方法,我懷疑任何人可以在Windows;如果確實如此,我會嘗試Cygwin,它在Windows上放置了足夠類似Linux的單板,以便經常在Windows盒子上使用類似Linux的方法。

7

這是關於默認情況下用Python緩衝的I/O。通過-u選項來解釋禁用此行爲:

python -u producer.py | python consumer.py 

它解決了這個問題對我來說。

+0

你讀過這個問題的最後一句話嗎? – jwg 2014-12-18 15:10:53