2014-09-10 9 views
4

Как я могу увидеть, что возвращает вкладка?Python - Как увидеть вывод завершения вкладки

Ill уточнить:

Позволяет сказать им открытия Баш оболочки, набрав l и нажав TAB. Получите все команды, содержащие символ l.

Теперь я знаю, как программно ввести полную команду оболочки и разобрать вывод,

, например:

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

, но как я могу видеть завершающие показывает, что TAB?

ответ

2

Завершение вкладки является частью режима readline. Вы получаете только режим чтения, если вы оба в интерактивном режиме, и на TTY. Итак, когда вы Popen, так что его stdin - это труба, вы не можете получить вкладку.

Вы можете увидеть это тестирование без Python в пути:

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

Ничего не происходит. Вы можете увидеть ^I после L, или 7 пробелов, или ничего вообще, но вы ничего не добьетесь.

Конечно, вы можете принудительно активировать интерактивный режим, но тогда он просто откроет /dev/tty и проигнорирует вашу трубу stdin, что не поможет.

Итак, что вам нужно сделать, это использовать pty модуль или функцию вместо subprocessopenpty или forkpty. Это не так приятно и высокоуровнево, но это действительно сработает.

Конечно, как только вы начнете чтение вывода TTY от bash, вы также начнете получать звуковые сигналы и символы перемещения курсора; Надеюсь, вы готовы справиться с этим.

Гораздо лучшим решением является не пытаться отправить вкладки в Баш, просто использовать compgen завершить вещи для вас программно:

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

Это -c означает, что вы хотите только имена команд. Вы можете заполнить целый ряд вещей - каталоги, имена файлов, переменные env и т. Д., Все, что может быть выполнено в любом контексте в интерактивной подсказке. Если вы хотите точно такие же вещи, которые были завершены в начале пустой командной строки, я считаю, что это -abc -A function (псевдонимы, встроенные функции, команды и функции), но прочитайте документы для получения полной информации.

+0

Спасибо ...... :) – MichaelR

Смежные вопросы