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

时间:2020-10-02 16:58:17

标签: python python-3.x shell subprocess

我正在尝试使用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()

出于某种原因返回一堆数字...:

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

如何从行中得到每个单词?

1 个答案:

答案 0 :(得分:1)

这是一种实现方法,它在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)