Pexpect回车问题

时间:2013-10-09 10:02:16

标签: python bash pexpect


我创建了一个使用pexpect来检索某些命令输出的应用程序 我做的命令的一个示例如下:

ps aux

这是直接来自pexpect的输出

root 28039 0.0 0.1 57780 3056 ? Ss Sep26 0:04 /opt/services/s^M
root 28093 0.5 0.4 131688 6492 ? Ss Sep26 93:25 /opt/services/s^M
root 28125 0.2 0.8 222680 13012 ? Ssl Sep26 36:21 /opt/services/s^M

这里的问题是输出被截断,并且不仅在输出的中间添加了'\ r' 这可以在命令中使用“| cat”解决,但我需要一个不涉及将输出重定向到cat的解决方案。

我发现这种情况发生在我发送一个大命令但是输出总是命令时,^ M在中间。

为了解决这个问题,我可以在终端或pexpect做任何改变吗?

2 个答案:

答案 0 :(得分:0)

使用

ps axuww

ww表示

   w               Wide output. Use this option twice for unlimited width.

import pexpect
child = pexpect.spawn('ps auxww')
while True:
    try:
        child.expect('\r\n')
        print(child.before)
    except pexpect.EOF:
        break

答案 1 :(得分:0)

如注释中所述,

由于隐式的终端宽度设置,ps aux命令正在截断其输出。您可以通过告诉ps使用宽输出(ww中的ps auxww)或增加终端宽度(pexpect setwinsize())来防止这种情况,如注释中所述。

输出中的^M是您的类UNIX操作系统,显示DOS样式的CR / LF行尾。这是因为pexpect实际上操作了psuedo-TTY设备。 pexect documentation

中有一些解释
  

匹配行尾的最佳方法是查找换行符:"\r\n"(CR / LF)。是的,这确实是DOS风格的。一些UNIX人士可能会惊讶地发现,终端TTY设备驱动程序(哑,vt100,ANSI,xterm等)都使用CR / LF组合来表示行尾。 Pexpect使用Pseudo-TTY设备与子应用程序通信,因此,当子应用程序打印"\n"时,您实际上会看到"\r\n"