围绕readline构建的python批处理的触发器选项卡完成

围绕readline构建的python批处理的触发器选项卡完成,python,batch-file,command-line-interface,stdin,readline,Python,Batch File,Command Line Interface,Stdin,Readline,背景:我有一个python程序,可以导入并使用readline模块构建自制的命令行界面。我有第二个python程序(围绕web微框架Battle构建),它充当CLI的前端。第二个python程序向第一个python程序打开了一个类似管道的接口,基本上在两者之间来回传递用户输入和CLI输出 问题:在外部包装程序(web界面)中,只要最终用户按下TAB键(或我绑定readline completer函数的任何其他键),该键就会插入CLI的stdin,而不会触发readline completer函数

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

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

可能的解决方案#1:是否有某种方法将TAB键发送到子流程的stdin,以便批量使用与交互使用的效果相同

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

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

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

谢谢!

解决方案#1被证明是一种可行的方法。关键是不要将web套接字直接连接到CLI应用程序。显然,readline正在回到某种更简单的模式,它过滤掉了所有选项卡,因为它没有连接到真正的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)
其他人。:)

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