Python - 读取长时间运行的子进程的输出

4
使用subprocess模块(Python 2.7),我正在运行一个命令并尝试在其运行时处理其输出。
我有以下代码:
process = subprocess.Popen(
    ['udevadm', 'monitor', '--subsystem=usb', '--property'],
    stdout=subprocess.PIPE)
for line in iter(process.stdout.readline, ''):
    print(line)

然而,即使我在打印语句后添加了sys.stdout.flush(),输出也只有在我按下Ctrl+C之后才会被打印出来。为什么会这样,并且我如何实时获取此进程的输出?值得注意的是,此udevadm monitor命令不打算终止,因此我不能简单地等待进程终止并一次性处理其输出。我发现live output from subprocess command,但接受的答案中的方法并没有解决我的问题。

请查看以下段落中以“如果subprocess的stdout使用块缓冲”开头的链接:https://dev59.com/iXE85IYBdhLWcg3wkkU8#17698359 - jfs
1个回答

4

你可以使用unbuffer

process = subprocess.Popen(
    ["unbuffer", 'udevadm', 'monitor', '--subsystem=usb', '--property'],
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(process.stdout.readline, ''):
    print(line)

谢谢!这个可以用。但是有没有只使用Python就能做到这一点的方法?我更喜欢避免expect依赖。 - Brandon
很不幸,我目前看不到任何解决办法,但这当然并不意味着解决办法不存在。如果我将某些内容从使用端口断开再重新连接,我确实可以看到一些输出,但这些输出是以块的形式而非按行缓冲,并且输出之间仍然存在相当的延迟。 - Padraic Cunningham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接