2014-09-10 4 views
4

완료를 반환하는 탭을 어떻게 알 수 있습니까?Python - 탭 완료 출력을 보는 방법

아픈 명확히 :

메신저, bash 쉘을 열고 l를 입력하고 탭을 클릭 말할 수 있습니다. 문자가 l 인 모든 명령을 가져옵니다.

지금, 내가 예를 들어

, 프로그래밍 방식 셸에 전체 명령을 입력하고 출력을 구문 분석하는 방법을 알고 :

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

하지만 어떻게 내가 무엇 TAB 완료 쇼를 볼 수 있습니까?

답변

2

탭 완성은 읽기 전용 모드의 일부입니다. 대화 형 모드와 TTY 둘 다인 경우에만 readline 모드가됩니다. 그래서, 당신이 Popen 일 때, 그것의 stdin이 파이프이기 때문에, 당신은 탭 완성을 얻을 수 없습니다.

당신은 방법으로 파이썬없이 테스트하여이 문제를 볼 수 있습니다

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

아무런 반응이 없습니다. L 다음에 ^I이 표시 될 수 있으며, 공백은 7 개이지만 아무 것도 입력하지 않아도 완료되지는 않습니다.

물론 대화 형 모드를 강제 할 수는 있지만 /dev/tty을 열고 stdin 파이프를 무시하면 도움이되지 않습니다.

pty 모듈을 사용하거나 subprocess 대신 openpty 또는 forkpty 함수를 사용해야합니다. 거의 최고 수준은 아니지만 실제로 작동 할 것입니다.

물론 bash의 TTY 출력을 읽기 시작하면 터미널 비프 음 및 커서 이동 문자도 시작하게됩니다. 네가 그걸 처리 할 준비가 되었기를 바란다.

훨씬 더 나은 솔루션은 프로그래밍 당신을 위해 일을 완료하는 데 compgen를 사용, 떠들썩한 파티에서 탭을 보내려고하지 않는 것입니다 :

-c 당신은 명령 이름을 원하는 의미
completions = subprocess.check_output('compgen -c l', shell=True).splitlines() 

. 디렉터리, 파일 이름, env 변수 등 대화 형 프롬프트의 모든 컨텍스트에서 완료 할 수있는 모든 작업을 완료 할 수 있습니다. 빈 명령 행의 시작 부분에서 완료된 것과 정확히 똑같은 것을 원하면, 그 것이 -abc -A function (별명, 내장 명령, 명령 및 기능)이라고 생각하지만, 자세한 내용은 문서를 읽으십시오.

+0

고맙습니다. ...... :) – MichaelR

관련 문제