使用pexpect跳过子进程的stdin和stderr

1 投票
1 回答
1431 浏览
提问于 2025-04-16 15:56

我正在使用pexpect来控制一个子进程(因为subprocess 不支持pty,而且我在使用两个管道时遇到了死锁问题)。这个进程在stderr上产生了很多输出,但我对这些输出不感兴趣,而且显然pexpect还会把我写入它的stdin的内容回显出来:

>>> import pexpect
>>> p = pexpect.spawn('rev')
>>> p.sendline('Hello!')
7
>>> p.readline()
'Hello!\r\n'
>>> p.readline()
'!olleH\r\n'

我该怎么关闭这个功能呢?

1 个回答

3

使用伪终端(pty)和管道(pipe)并不是一回事。如果你不把它设置为原始模式,终端驱动程序会把你输入的字符回显出来,还会进行其他的行编辑。所以为了确保数据传输干净,你需要把伪终端/终端设置为原始模式。

因为你现在使用的是一个伪设备,所以只有一个输入输出流。在这里,标准输出(stdout)和标准错误(stderr)没有区别(这是用户空间的约定)。所以当你使用伪终端/终端时,你总是会看到标准输出和标准错误混在一起。

撰写回答