1


我创建了一个应用程序,它使用 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 的命令。

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

4

2 回答 2

1

利用

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
于 2013-10-09T10:10:04.457 回答
0

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

输出中的^M是您的类 UNIX 操作系统,显示 DOS 样式的 CR/LF 行尾。这是因为 pexpect 实际上运行的是一个伪 TTY 设备。pexect文档中解释了一些内容

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

于 2019-06-20T18:14:40.840 回答