Завершение вкладки является частью режима readline. Вы получаете только режим чтения, если вы оба в интерактивном режиме, и на TTY. Итак, когда вы Popen
, так что его stdin - это труба, вы не можете получить вкладку.
Вы можете увидеть это тестирование без Python в пути:
$ socat TCP-LISTEN:12345 EXEC:bash &
$ nc localhost 12345
l<TAB>
Ничего не происходит. Вы можете увидеть ^I
после L
, или 7 пробелов, или ничего вообще, но вы ничего не добьетесь.
Конечно, вы можете принудительно активировать интерактивный режим, но тогда он просто откроет /dev/tty
и проигнорирует вашу трубу stdin, что не поможет.
Итак, что вам нужно сделать, это использовать pty
модуль или функцию вместо subprocess
openpty
или forkpty
. Это не так приятно и высокоуровнево, но это действительно сработает.
Конечно, как только вы начнете чтение вывода TTY от bash, вы также начнете получать звуковые сигналы и символы перемещения курсора; Надеюсь, вы готовы справиться с этим.
Гораздо лучшим решением является не пытаться отправить вкладки в Баш, просто использовать compgen
завершить вещи для вас программно:
completions = subprocess.check_output('compgen -c l', shell=True).splitlines()
Это -c
означает, что вы хотите только имена команд. Вы можете заполнить целый ряд вещей - каталоги, имена файлов, переменные env и т. Д., Все, что может быть выполнено в любом контексте в интерактивной подсказке. Если вы хотите точно такие же вещи, которые были завершены в начале пустой командной строки, я считаю, что это -abc -A function
(псевдонимы, встроенные функции, команды и функции), но прочитайте документы для получения полной информации.
Спасибо ...... :) – MichaelR