2012-03-05 1 views
10

optparse 모듈을 사용하여 optcomplete을 테스트했습니다. 그 예제는 단순한 파일이므로 작동하도록 할 수 있습니다. 또한 이전에 권장되지 않았던 것처럼 argparse 모듈을 사용하여 테스트했습니다. 하지만 실제로 파이썬 프로그램이 탭 프레스에서 어떻게 호출되는지 이해하지 못합니다. 나는 bashshebang 줄과 argparse (또는 optparse) 모듈과 함께 사용한다고 생각합니다. 나는 이것을 알아 내려고 노력 해왔다. (이제 소스 코드를 읽을 것이다.)argparse (그리고 사용되지 않는 optparse)는 bash에서 파이썬 프로그램 이름 뒤에 'tab'키 누르기에 어떻게 반응합니까?

필자는 인수를 처리하는 코드 조각 주위에 래퍼를 포함하는 좀 더 복잡한 프로그램 구조를 가지고 있습니다. 그것의 argparse.ArgumentParser() 인스턴스화와 add_argument()에 대한 호출은 코드 복제를 피하기 위해 다른 중간 모듈로 수퍼 클래 싱되어 있으며 호출되는 래퍼는 함수 내에 있습니다.

bash와 python간에이 탭 완성이 작동하는 방식을 이해하고 싶습니다. (또는 다른 해석자 인 perl과 같이) 이해하고 싶습니다.

참고 : 나는 bash 완성 (지금 막 배웠다)에 대한 공정한 이해를 가지고 있으며 bash (only) 사용자 정의 완성을 이해하고 있다고 생각합니다.

참고 : 나는 다른 유사한 SO 질문을 읽고, 아무도 정말이 Q.에게

편집에 대답하지 : Here은 bash는 기능입니다.
는 이미 단지 탭을 누릅니다에 값이 변수

$COMP_WORDS 
$COMP_CWORD 
$COMP_LINE 
$COMP_POINT 
$COMPREPLY 

이 변수의 os.environ 값을 읽고, 파이썬 모듈은 명령 줄에 입력 한 단어에 대해 알고 얻는 방법을 이해했다. 제 질문은 어떻게 파이썬 모듈을 트리거 가져옵니다?

+0

'optcomplet'문서에서는 "Bash 함수를 소스로 사용하고 Bash가이를 사용하는 특정 프로그램에 대한 완전한 완성을 트리거하도록 지시해야합니다 :". 네가 그렇게했다면 왜 아직도 어떻게 작동하는지 묻는거야? 완성을 요청할 경우 bash에게 어떤 프로그램을 호출해야하는지 분명히 밝혀야합니다. –

+0

죄송합니다, 나는 내가 읽은 것을 오해했습니다. 나는 그것에 대한 답을 추가 할 것이다. –

답변

14

여기에 무슨 일이 일어나고 있는지 이해하기 위해 그 bash는 기능이 실제로 무엇을하는지 확인하자 :

COMPREPLY=($(\ 
    COMP_LINE=$COMP_LINE COMP_POINT=$COMP_POINT \ 
    COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ 
    OPTPARSE_AUTO_COMPLETE=1 $1)) 

가 마지막에 $1를 참조하십시오? 즉, 실제로 특수한 환경 변수를 설정하여 실행하고자하는 Python 파일을 호출합니다!

$ ./test.py [tab] 
called with args: ['./test.py'] 
    ... 
    COMP_CWORD: 1 
    COMP_LINE: ./test.py 
    COMP_POINT: 10 
    COMP_WORDS: ./test.py 
    ... 
    OPTPARSE_AUTO_COMPLETE: 1 
    ... 
autocomplete tried to exit with status 1 
autocomplete tried to write to STDOUT: 
-o -h -s -p --script --simple --help --output 

그래서 optcomplete.autocomplete 단지 환경을 읽고 준비 :

#!/usr/bin/env python2 
import os, sys 
import optparse, optcomplete 
from cStringIO import StringIO 

if __name__ == '__main__':  
    parser = optparse.OptionParser() 

    parser.add_option('-s', '--simple', action='store_true', 
         help="Simple really simple option without argument.") 

    parser.add_option('-o', '--output', action='store', 
         help="Option that requires an argument.") 

    opt = parser.add_option('-p', '--script', action='store', 
          help="Option that takes python scripts args only.") 
    opt.completer = optcomplete.RegexCompleter('.*\.py') 

    # debug env variables 
    sys.stderr.write("\ncalled with args: %s\n" % repr(sys.argv)) 
    for k, v in sorted(os.environ.iteritems()): 
     sys.stderr.write(" %s: %s\n" % (k, v)) 

    # setup capturing the actions of `optcomplete.autocomplete` 
    def fake_exit(i): 
     sys.stderr.write("autocomplete tried to exit with status %d\n" % i) 
    sys.stdout = StringIO() 
    sys.exit = fake_exit 

    # Support completion for the command-line of this script. 
    optcomplete.autocomplete(parser, ['.*\.tar.*']) 

    sys.stderr.write("autocomplete tried to write to STDOUT:\n") 
    sys.stderr.write(sys.stdout.getvalue()) 
    sys.stderr.write("\n") 

    opts, args = parser.parse_args() 

이것은 우리가 그것을 자동 완성하려고 할 때 다음과 같은 우리에게 제공 : 무슨 일이 일어나고 있는지 추적하기 위해,이 optcomplete.autocomplete가 무엇을 차단하기 위해 약간의 스크립트를 준비하자 성냥은 그들을 STDOUT에 쓰고 종료합니다. 그런 다음 -o -h -s -p --script --simple --help --output 결과는 bash h 열 (COMPREPLY=(...))에 넣고 bash로 리턴하여 사용자에게 선택 사항을 제공합니다. 어떤 마법도 포함되어 있지 않습니다 :)

+0

안녕하세요, 정말로 감사드립니다. 귀하의 의견을 읽고 페이지를 통해 링크를 얻으려고 할 때 $ 1이라는 사실을 알았습니다.그때 나는 이미 알고 있지만 결코 사용하지 않은 것에 충격을 받았습니다. $ 1은 첫 번째 인수입니다 .- : S. 이전에는 그렇게하지 못했던 것은 어리석은 행동이었습니다. – 0xc0de

+0

+1 좋고 명확한 예 :) – 0xc0de

관련 문제