【问题标题】:trigger tab completion for python batch process built around readline触发围绕readline构建的python批处理的选项卡完成
【发布时间】:2012-09-04 21:37:00
【问题描述】:

背景:我有一个python程序,它导入并使用readline模块来构建一个自制的命令行界面。我有第二个 python 程序(围绕瓶子构建,一个 Web 微框架)充当该 CLI 的前端。第二个 python 程序为第一个打开了一个类似于管道的接口,本质上是在两者之间来回传递用户输入和 CLI 输出。

问题:在外包装程序(Web 界面)中,每当最终用户按下 TAB 键(或我绑定 readline 完成函数的任何其他键)时,都会插入该键进入 CLI 的标准输入 而不 触发 readline 完成函数。我需要它来触发 readline 的命令完成功能,这通常发生在交互式 CLI 会话期间。

可能的解决方案 #1: 是否有某种方法可以将 TAB 键发送到子进程的标准输入,以便批处理使用与交互式使用相同?

可能的解决方案 #2: 或者,如果有某种方法可以手动触发整个完成过程(包括匹配 generationdisplay) ,我可以插入并扫描一个特殊的文本序列,比如"<TAB_KEY_HERE>",手动触发可能的完成匹配display函数。 (我编写了完成函数,它生成可能的匹配项,所以我真正需要的是访问 readline 的函数来显示可能的匹配项。)

可能的解决方案#3:我猜,如果我无法访问readline的matches-display函数,最后一个选择是重写readline的内置显示完成函数,这样我就可以直接调用它了。 :(

有没有更好的解决方案?关于遵循上述任何解决方案提供的路径的任何建议?我被困在 #1 和 #2 上,我试图避免 #3。

谢谢!

【问题讨论】:

    标签: python batch-file command-line-interface stdin readline


    【解决方案1】:

    解决方案 #1 被证明是一种可行的方法。关键是将 Web 套接字直接连接到 CLI 应用程序。显然,readline 正在退回到一些更简单的模式,该模式过滤掉了所有 TAB,因为它没有连接到真正的 PTY/TTY。 (我可能记不太对了。许多蜘蛛网已经形成。)相反,需要打开一对 PTY/TTY 并将其插入 CLI 应用程序和 web-sockets 应用程序之间,这使 CLI 应用程序误以为它已连接到一个真正的基于键盘的终端,如下所示:

    import pty
    masterPTY, slaveTTY = pty.openpty()
    appHandle = subprocess.Popen(
        ['/bin/python', 'myapp.py'],
        shell=False,
        stdin=slaveTTY,
        stdout=slaveTTY,
        stderr=slaveTTY,
        )
    ...
    while True
        # read output from CLI app
        output = os.read(masterPTY, 1024)
        ...
        # write output to CLI app
        while input_data:
            chars_written = os.write(masterPTY, input_data)
            input_data = input_data[chars_written:]
        ...
    appHandle.terminate()
    os.close(masterPTY)
    os.close(slaveTTY)
    

    HTH 别人。 :)

    有关更多背景信息,请参阅相关问题的答案:

    https://stackoverflow.com/a/14565848/538418

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2019-03-02
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多