问题
如何使用pexpect获得具有多行输出的命令的输出?
示例
这段代码可以工作,尽管输出被粉碎成一行:
child = pexpect.spawn('ping -c 3 1.1.1.1')
child.expect(pexpect.EOF)
print(child.before)但是,此代码不起作用:
child = pexpect.spawn('hostname')
child.expect(pexpect.EOF)
print(child.before)
child.seldline('ping -c 3 1.1.1.1')
child.expect(pexpect.EOF)
print(child.before)我怎样才能让第二个代码工作呢?
背景
我有一些命令需要运行才能连接(这里用主机名替换),然后是输出多行(用ping替换)的命令,这些命令似乎无法获得输出。如果我找除EOF以外的任何字符串,我会得到EOF异常.
如果您需要证明,我实际运行的命令就在这里:
另一个问题的答案可能会被否决,因为这一段代码完全被复制,只是一次又一次地输出b''。
发布于 2022-08-18 15:31:31
生成一个将保持打开的PID
真正的问题是:为什么第二个例子不起作用。
pexpect.spawn对象(此处的“子”)指向进程id (PID)。我试图使用的示例不起作用,因为hostname正在运行,然后退出。在我的实际使用中,我使用的是ssh,然后是长输出命令(这里由ping表示)之前的其他几个必要步骤。
使用一个持续运行的命令启动多步进程将解决这个问题。这两个例子中的任何一个都会奏效:
child = pexpect.spawn('ssh user@host')
child = pexpect.spawn('bin/bash')我转而使用后者,它产生了一个新的shell,我可以与之交互。这允许我向ssh连接添加一些错误处理,并在一个shell中多次重用代码。
请注意,如果分别退出ssh连接或bash,则需要生成一个新的“子”来发送更多命令。
使用非阻塞读取。
额外细节:修复第一个/工作示例的输出。
此代码将返回最后一个命令的输出,而不更改它。
def try_read(child):
"""Based on pexpect.pxssh.try_read_prompt"""
total_timeout = 3
timeout = 0.5
inter_char_timeout = 0.1
begin = time.time()
expired = 0
prompt = ''
while expired < total_timeout:
try:
prompt += child.read_nonblocking(size=1, timeout=timeout)
expired = time.time() - begin # updated total time expired
timeout = inter_char_timeout
except TimeoutError:
print("read ended with TimeoutError")
break
except pexpect.TIMEOUT:
print("read ended with pexpect.Timeout")
break
except pexpect.EOF:
print("read ended with pexpect.EOF")
break
return prompthttps://stackoverflow.com/questions/73144952
复制相似问题