如何获得实时 Python 子进程输出?

How to get realtime Python subprocess output?

我正在尝试 运行 使用 shell 命令的程序,每秒输出一个单词。我试图在 Python 脚本中执行 shell 命令,并在每个输出的单词上获得实时输出。我在网上找到的所有其他解决方案实际上并没有打印实时输出,而是一次完成一行。我想获得 real 实时输出,其中每个单词都是实时打印的,而不是每一行。这是我试过的代码:

cmd=['slowprogram','-m', '15', '-l', '50']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=1)
for line in iter(p.stdout.readline, b''):
    print(line),
p.stdout.close()
p.wait()

它会等到一行完成并打印出来。有没有办法实时获取更新并打印一行中的每个单词?

更新:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=1)
for line in iter(p.stdout.readline, b''):
    for word in iter(line):
      print(word)
p.stdout.close()
p.wait()

returns 由于某种原因一堆数字...:[=​​14=]

111
117
108
100
32
104
97
118
101
32
115
97

如何从行中获取每个单词?

这是一种方法,它在 Linux shell 中对我有用。它使用一个无缓冲的 IO 对象并一次打印一个字符。我很确定有更好的方法,因为我不是 subprocess 或事件处理方面的专家。您可能还想查看 asyncio.

with subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=0) as p:
    char = p.stdout.read(1)
    while char != b'':
        print(char.decode('UTF-8'), end='', flush=True)
        char = p.stdout.read(1)