繁体   English   中英

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

[英]How to get realtime Python subprocess output?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM