2014-09-24 59 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

相关问题