我创建了一个使用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做任何改变吗?
答案 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"
。