2

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

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

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

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

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

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

谢谢!

4

1 回答 1

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

于 2013-11-04T18:21:46.523 回答