首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pexpect多行输出

Pexpect多行输出
EN

Stack Overflow用户
提问于 2022-07-27 21:45:53
回答 1查看 81关注 0票数 1

问题

如何使用pexpect获得具有多行输出的命令的输出?

示例

这段代码可以工作,尽管输出被粉碎成一行:

代码语言:javascript
复制
child = pexpect.spawn('ping -c 3 1.1.1.1')
child.expect(pexpect.EOF)
print(child.before)

但是,此代码不起作用:

代码语言:javascript
复制
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''

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-18 15:31:31

生成一个将保持打开的PID

真正的问题是:为什么第二个例子不起作用。

pexpect.spawn对象(此处的“子”)指向进程id (PID)。我试图使用的示例不起作用,因为hostname正在运行,然后退出。在我的实际使用中,我使用的是ssh,然后是长输出命令(这里由ping表示)之前的其他几个必要步骤。

使用一个持续运行的命令启动多步进程将解决这个问题。这两个例子中的任何一个都会奏效:

代码语言:javascript
复制
child = pexpect.spawn('ssh user@host')
child = pexpect.spawn('bin/bash')

我转而使用后者,它产生了一个新的shell,我可以与之交互。这允许我向ssh连接添加一些错误处理,并在一个shell中多次重用代码。

请注意,如果分别退出ssh连接或bash,则需要生成一个新的“子”来发送更多命令。

使用非阻塞读取。

额外细节:修复第一个/工作示例的输出。

此代码将返回最后一个命令的输出,而不更改它。

代码语言:javascript
复制
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 prompt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73144952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档