【问题标题】:pexpect get application informationpexpect 获取应用信息
【发布时间】:2020-05-26 16:08:24
【问题描述】:

我正在使用 pexpect 从 linux 主机运行 nano,我正在尝试找到一种从 pexpect 获取信息的方法,以便我可以在其他地方重建 nano(或 vi 或任何终端应用程序)。

比如:

p = pexpect.spawn('/bin/bash')
p.sendline('nano cheese')
#Get the tty information for the nano/vi/whatever UI#

我本质上想转发信息(即应用程序 UI 的信息)而不直接与之交互,这可能吗?

【问题讨论】:

    标签: python python-3.6 pexpect


    【解决方案1】:

    通常,处理这种情况的方法是 .interact(),它将子进程置于当前进程中。但是,听起来您不想交互,而是想从父进程控制子进程。

    这样的事情应该可以工作:

    import pexpect
    
    p = pexpect.spawn('nano cheese')
    output = []
    while p.isalive():
        output.append(p.read_nonblocking(100000))
        #Conditionals about what is in output could be put here. 
        #You can also tell pexpect to block until it finds specific strings, with .expect()
        p.sendline(input().encode())
    

    试图按照“nano”中应该输入的内容,我想你想做这样的事情:

    y       #answer yes to first question
    ^X      #exit nano
    n       #no, don't save
    <enter> #anything sent should end the process here.
    

    这假设“nano”没有询问意外情况,例如已经有文件或其他内容等。您可以使用 p.expect 根据输出中显示的字符串启动某些操作。打印输出以查看“nano”发送给您的内容。

    print(output)
    

    【讨论】:

    • 是的,这就是我想要的,我要试试这段代码,然后稍微弄乱一下。虽然更具体地说,我正在尝试通过 websockets PIPE 应用程序,但是当进程切换到 nano 时我丢失了所有 UI(您会期望),但我实际上是在尝试拥有一个交互式 shell [例如pty.spawn("/bin/bash")] 通过 websockets,我可以实时运行长脚本并维护我的会话,但我坚持实现功能以允许 nano 和 vi 等。
    • 这看起来已经很好了,我可能不得不让你成为我的新 BFF
    • 大声笑,谢谢,很高兴能帮上忙。 pexpect 模块确实具有强大的功能,它处理了手动执行此操作时的许多繁琐困难。
    • 有没有办法告诉我我已经以一种简单的方式从 bash 切换到 nano?我显然可以在响应中看到一些标识符,但我想做一些通用的东西 - 我的应用程序理论上不会知道 ls -lanano cheese 之间的区别,可能只是简单地检查 tty 更改
    • 我不这么认为。除非您是跟踪发送到子流程的内容或分析输出的人。不保证您发送的内容会产生另一个子子流程,它可能会失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2012-12-30
    相关资源
    最近更新 更多