2015-09-12 77 views
4

speaker.py,我用print輸出文本到STDOUT如何編寫適用於Linux管道的Python腳本?

import time 

while True: 
    time.sleep(1) 
    print("hello") 

而在listener.py,我使用inputSTDIN閱讀:

while True: 
    line = input() 
    if not line: 
     break 
    print(line) 

我想這兩個腳本與連接管道:

python speaker.py | python listener.py

但是listner.py什麼都不輸出。

怎麼了?

+1

當標準輸出是一個tty,它是行緩衝。當它是別的東西時,它被塊緩衝。要麼顯式刷新緩衝區,要麼使用行緩衝重新打開標準輸出。 –

回答

5

本質上沒有錯,但是你遇到了緩衝。取出sleep,你應該立即看到輸出。

http://mywiki.wooledge.org/BashFAQ/009名義上是一個Bash問題,但適用於任何Unix類型的I/O,並且徹底解釋了這些問題。

5

重新開口標準輸出作爲安德烈提到另一種方法是啓動的Python在非緩衝模式與-u選項:

python -u speaker.py | python -u listener.py 
+0

偉大的提示;只是爲了補充它:嚴格地說,你不需要_2nd_'-u' _here_,因爲'-u'只涉及標準的_output_ streams(stdout,stderr)。 '-u'的替代方法是將'PYTHONUNBUFFERED'環境變量設置爲非空值 - 請參閱https://docs.python.org/3.5/using/cmdline.html#cmdoption-u – mklement0