我需要运行一个程序并收集它的标准输出。这个程序(socat)需要在Python脚本的整个过程中在后台运行。一旦运行,socat就会进入守护进程模式,但首先它会输出一些行到stdout,我需要这些行来进行脚本的后续操作。
命令:socat -d -d PTY: PTY:
输出:
2011/03/23 21:12:35 socat[7476] N PTY is /dev/pts/1
2011/03/23 21:12:35 socat[7476] N PTY is /dev/pts/2
2011/03/23 21:12:35 socat[7476] N starting data transfer loop with FDs [3,3] and [5,5]
我基本上想要在程序开始时运行它并一直保持运行状态,直到脚本终止,但我需要将两个/dev/pts/X名称读入Python中。
有人能告诉我如何做吗?
我想出了下面的代码,但它一直挂起,我猜测是因为它在等待子进程终止。
#!/usr/bin/python
from subprocess import Popen, PIPE, STDOUT
cmd = 'socat -d -d PTY: PTY: &'
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
output = p.stdout.read()
# Process the output
print(output)
感谢任何帮助。编辑:似乎它可以写入stderr,但是脚本仍然会挂起,使用和不使用&时都读取stderr。
&
会工作吗? - Marcelo CantosPopen
后阻塞,而不是在read()
调用上阻塞吗? - Jeff