Python – 如何查看选项卡完成输出

如何查看选项卡完成返回的内容?

我要澄清:

让我们说我打开一个bash shell,输入l并单击TAB.
我得到包含l char的所有命令.

现在,我知道如何以编程方式向shell输入完整命令并解析输出,

例如:

def shell_output()
    p = subprocess.Popen(command,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)
    print iter(p.stdout.readline, '')

但我怎么能看到TAB完成显示的内容?

最佳答案 选项卡完成是readline模式的一部分.如果您处于交互模式和TTY,则只能获得readline模式.所以,当你打开它时,所以它的stdin是一个管道,你不能得到标签完成.

你可以通过在没有Python的情况下进行测试来看到这一点:

$socat TCP-LISTEN:12345 EXEC:bash &
$nc localhost 12345
l<TAB>

什么都没发生.您可能会在L或7个空格后看到^ I,或者根本没有任何东西,但是您不会得到任何完成的任何内容.

当然你可以强制交互模式,但是它只是打开/ dev / tty并忽略你的stdin管道,这没有用.

因此,您需要做的是使用pty模块或openptyforkpty函数而不是子进程.它不是那么好和高级别,但它实际上会起作用.

当然,一旦你开始阅读bash的TTY输出,你就会开始得到终端的哔哔声和光标移动字符;我希望你准备好应对这一点.

一个更好的解决方案是不尝试在bash发送标签,只需使用compgen以编程方式为您完成任务:

completions = subprocess.check_output('compgen -c l', shell=True).splitlines()

那个-c意味着你只需要命令名.您可以完成大量的事情 – 目录,文件名,env变量等,可以在交互式提示的任何上下文中完成的任何事情.如果你想要在空命令行的开头完成相同的事情,我相信它是-abc -A函数(别名,内置函数,命令和函数),但是阅读文档以获取完整的详细信息.

点赞