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

问题描述:

使用子进程模块(Python 2.7),我正在运行一个命令并尝试在运行时处理其输出。Python - 从长时间运行的子进程读取输出

我有类似下面的代码:

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

然而,只输出被打印后,我按Ctrl + C,即使我在打印语句后添加sys.stdout.flush()

为什么会发生这种情况,我该如何直播这个过程的输出?

值得注意的是,这个udevadm monitor命令不打算终止,所以我不能简单地等待进程终止并一次处理其输出。

我发现live output from subprocess command但接受的答案中的方法并没有解决我的问题。

+0

参见[段落是开头的联系:“如果子标准输出采用的是块缓冲”(http://stackoverflow.com/a/17698359/ 4279) – jfs

你可以使用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) 
+0

谢谢!这工作。但有没有办法只用Python来做到这一点?我宁愿避免“expect”依赖。 –

+0

不幸的是,我不能看到一种方式,但肯定并不意味着没有,我确实看到一些输出,如果我断开并重新连接到使用端口的东西,但大块比行缓冲,仍然在输出之间的体面延迟 –