#!/usr/bin/python
from subprocess import Popen, PIPE, STDOUT
import pty
import os
cmd = 'socat -d -d PTY: PTY:'
master, slave = pty.openpty()
p = Popen(cmd, shell=True, stdin=PIPE, stdout=slave, stderr=slave, close_fds=True)
stdout = os.fdopen(master)
print stdout.readline()
print stdout.readline()
您的版本有两个问题。首先,您调用无参数的read,这意味着它将尝试读取所有内容。但是由于socat不会终止,所以它永远不会决定已读取所有内容。通过使用readline,python只会读取直到找到换行符。根据我对您问题的了解,这就是您所需要的。
第二个问题是C标准库将缓冲管道上的输出。我们通过使用openpty()函数创建一个pty并将其传递给子进程的stdout和stderr来解决该问题。我们使用fdopen使该文件描述符成为常规的python对象,并摆脱了缓冲。
我不知道您在用socat做些什么,但是我想知道是否可以使用pty模块代替它。您正在将一个pty复制到另一个pty,而openpty正在创建一对pty。也许您可以直接使用它们?