2014-09-24 61 views
3

正如在回答中提出我的問題「Python: start terminal program and parse its output while it's running」我使用的是子結構與程序進行通信:蟒子更新其行( r) - 我需要在每次更新

server = subprocess.Popen(["meteor", "--port", port], stdout=subprocess.PIPE) 

for line in iter(server.stdout.readline, ""): 
    # Do something for example 
    print(line) 

的問題是:子進程(服務器)不直接用換行符結束每行,因爲它將(x2)放在行尾,當消息重複時。

但我想對每一行更新作出反應。所以我想要處理\r\n,而不是隻遍歷完成的線,我想遍歷可用的字符串,直到下一個「暫停」,它是一個\r\n或另一個換行符,直接獲取信息時,不僅在服務器發送\n時。我怎樣才能做到這一點?

+0

輸出緩衝處於正在運行的程序的控制之下,如果不沖刷每個字符上的緩衝區,則可以做的事情不多。 – 2014-09-24 02:18:13

+1

@MarkRansom'Popen.stdout'默認沒有緩存 - 問題是'readline',不是? – roippi 2014-09-24 02:21:05

+1

在這種情況下,請勿使用'readline',請使用'read'。 – 2014-09-24 02:21:34

回答

4

也許如果您試圖使用非阻塞管道連接。然後像socket連接一樣讀取流(在一段時間(true)循環中)......希望這會指向正確的方向。

from fcntl import fcntl, F_GETFL, F_SETFL 
from os import O_NONBLOCK, read 

server = subprocess.Popen(["meteor", "--port", port], stdout=subprocess.PIPE) 
flags = fcntl(server.stdout, F_GETFL) # get current p.stdout flags 
fcntl(server.stdout, F_SETFL, flags | O_NONBLOCK) 

while True: 
    print read(server.stdout.fileno(), 1024), 

您需要爲刪除的連接添加錯誤處理或不再添加數據。

+0

p.stdout應該是server.stdout,但它實際上工作正常。謝謝!! – Tobi 2014-09-24 11:10:23

相關問題