python子进程更新它的行(\ r) - 我需要每次更新

Tob*_*obi 4 python carriage-return

正如对我的问题“ Python:启动终端程序并在其运行解析其输出”的回答中所建议的,我正在使用子进程构造与程序进行通信:

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

for line in iter(server.stdout.readline, ""):
  # Do something for example
  print(line)
Run Code Online (Sandbox Code Playgroud)

问题是:当消息重复时,子进程(服务器)不会直接以换行符结束每一行,因为它将 (x2) 放在一行的末尾。

但我想对每一行更新做出反应。所以,我想处理\r\n,而不只是迭代过完线,我想遍历可用的字符,直到下一个“暂停”羯羊它是一个\r\n出现时或其他线路中断,直接获取信息,不仅当服务器发送一个\n. 我怎样才能做到这一点?

use*_*942 5

也许如果您尝试使用非阻塞管道连接。然后像套接字连接一样读取流(在 while(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),
Run Code Online (Sandbox Code Playgroud)

您需要为断开的连接或没有更多数据添加错误处理。