[英]Pexpect carriage return issue
我创建了一个使用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的命令时。
为了解决此问题,我可以在终端机上还是在预想中进行任何更改吗?
采用
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
如注释中所述,由于隐式端子宽度设置, ps aux
命令正在截断其输出。 您可以通过告诉ps使用宽输出( ps auxww
的ww
)或增加终端宽度(pexpect setwinsize()
)来防止这种情况,如注释中所述。
输出中的^M
是类UNIX操作系统,显示DOS样式的CR / LF行尾。 这是因为pexpect实际上操作了psuedo-TTY设备。 pexect 文档中解释的内容
匹配行尾的最佳方法是查找换行符:
"\\r\\n"
(CR / LF)。 是的,这确实是DOS风格的。 一些UNIX人士可能会惊讶地发现,终端TTY设备驱动程序(哑,vt100,ANSI,xterm等)都使用CR / LF组合来表示行尾。 Pexpect使用Pseudo-TTY设备与子应用程序对话,因此,当子应用程序打印"\\n"
您实际上会看到"\\r\\n"
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.