파이썬, 명령 줄 프로그램을 인터프리터가 아닌 임의의 것을 자동 완성하는 방법


97

파이썬 인터프리터 (유닉스에서)에서 파이썬 객체의 자동 완성을 설정하는 방법을 알고 있습니다.

  • Google은이를 수행하는 방법에 대한 설명을 위해 많은 히트를 표시합니다.
  • 안타깝게도 참조가 너무 많아서 제가해야 할 일을 찾기가 어렵습니다. 약간 다릅니다.

파이썬으로 작성된 명령 줄 프로그램에서 임의 항목의 탭 / 자동 완성을 활성화하는 방법을 알아야합니다.

내 특정 사용 사례는 이메일을 보내야하는 명령 줄 Python 프로그램입니다. 사용자가 이메일 주소의 일부를 입력 할 때 (그리고 선택적으로 TAB 키를 누를 때) 이메일 주소 (디스크에 주소가 있음)를 자동 완성 할 수 있기를 원합니다.

Windows 나 Mac에서 작동하는 데 필요하지 않으며 Linux 만 있습니다.


블로그 는 .pythonrc 파일을 구성하여 트릭을 수행해야합니다.
Kris Roofe 2017-06-10

답변:


65

Python의 readline바인딩을 사용합니다 . 예를 들면

import readline

def completer(text, state):
    options = [i for i in commands if i.startswith(text)]
    if state < len(options):
        return options[state]
    else:
        return None

readline.parse_and_bind("tab: complete")
readline.set_completer(completer)

공식 모듈 문서 는 그다지 상세하지 않습니다. 자세한 내용은 readline 문서 를 참조하세요.


1
cmd 모듈을 사용하여 명령 줄을 작성하면 더 나은 방법이 있다는 점에 유의하십시오.
Florian Bösch

60

을 따르지 cmd를 문서를 그리고 당신은 괜찮을거야

import cmd

addresses = [
    'here@blubb.com',
    'foo@bar.com',
    'whatever@wherever.org',
]

class MyCmd(cmd.Cmd):
    def do_send(self, line):
        pass

    def complete_send(self, text, line, start_index, end_index):
        if text:
            return [
                address for address in addresses
                if address.startswith(text)
            ]
        else:
            return addresses


if __name__ == '__main__':
    my_cmd = MyCmd()
    my_cmd.cmdloop()

탭 출력-> 탭-> 보내기-> 탭-> 탭-> f-> 탭

(Cmd)
help  send
(Cmd) send
foo@bar.com            here@blubb.com         whatever@wherever.org
(Cmd) send foo@bar.com
(Cmd)

readline이 출력을 컬럼 화하는 방법을 제어하는 ​​방법이 있습니까? 따라서 각 항목 사이에 두 개의 공백으로 열화하고 싶다고 가정 해 보겠습니다.
Fnord 2013

이 코드를 실행하면 탭이 명령 줄에 인쇄됩니다. 사실 이것은 내가 cmd를 사용하든 직선 readline을 사용하든 관계없이 사실입니다.
해킹 톱

38

질문에 "NOT 인터프리터"라고 말 했으므로 파이썬 readline과 관련된 답변을 원하지 않는 것 같습니다. ( 편집 : 돌이켜 보면 분명히 그렇지 않습니다. Ho hum. 어쨌든이 정보가 흥미 롭다고 생각하므로 여기에 남겨 두겠습니다. )

나는 당신 이 이것 이후에있을 것이라고 생각합니다 .

임의의 명령에 셸 수준 완성을 추가하여 bash의 자체 탭 완성을 확장하는 것입니다.

요컨대, 가능한 완성을 생성하는 셸 함수를 포함하는 파일을 만들고, 저장 /etc/bash_completion.d/한 다음 명령으로 등록합니다 complete. 다음은 연결된 페이지의 스 니펫입니다.

_foo() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help --verbose --version"

    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _foo foo

이 경우 입력 foo --[TAB]하면 변수 opts, 즉 --help, --verbose및 의 값이 제공 됩니다 --version. 목적을 위해 기본적으로에 입력되는 값을 사용자 정의하고 싶을 것 opts입니다.

링크 된 페이지의 예제를 살펴보면, 모두 매우 간단합니다.


11
사실 나는 그것 때문에 여기 온
user1767754

고마워요, 바로 제가 찾던 것입니다!
Teekeks

30

아무도 argcomplete를 언급하지 않았다는 사실에 놀랐습니다. 다음은 문서의 예입니다.

from argcomplete.completers import ChoicesCompleter

parser.add_argument("--protocol", choices=('http', 'https', 'ssh', 'rsync', 'wss'))
parser.add_argument("--proto").completer=ChoicesCompleter(('http', 'https', 'ssh', 'rsync', 'wss'))

이전 게시물입니다. 아마도 argcomplete가 그 당시 존재하지 않았을까요? 그래도 언급 해 주셔서 감사합니다. 제 프로젝트에 꼭 필요한 것 같아요!
FrustratedWithFormsDesigner

argparse 와 함께 아주 좋습니다 !
AstroFloyd

14

여기에 매우 ephemient에 의해 공급 된 코드의 전체 작업 버전 여기가 (감사합니다).

import readline

addrs = ['angela@domain.com', 'michael@domain.com', 'david@test.com']

def completer(text, state):
    options = [x for x in addrs if x.startswith(text)]
    try:
        return options[state]
    except IndexError:
        return None

readline.set_completer(completer)
readline.parse_and_bind("tab: complete")

while 1:
    a = raw_input("> ")
    print "You entered", a

10
# ~/.pythonrc
import rlcompleter, readline
readline.parse_and_bind('tab:complete')

# ~/.bashrc
export PYTHONSTARTUP=~/.pythonrc

1
맥 OS의 경우, 교체 readline.parse_and_bind('tab:complete')readline.parse_and_bind ("bind ^I rl_complete")
마니

굉장합니다. 나를 위해 일했습니다. 공유해 주셔서 감사합니다.
Ajay Ahuja

@Mani 나는 오랫동안 이것에 갇혀 있었다. 대단히 감사합니다
AnaS Kayed

5

Python Prompt Toolkit을 사용해 볼 수 있습니다. 에서 대화 형 명령 줄 애플리케이션을 빌드하기위한 라이브러리 인 .

라이브러리를 사용하면 대화 형 자동 완성 기능을 쉽게 추가 할 수 있으므로 사용자가 Tab키를 사용하여 사용 가능한 선택 항목을 시각적으로 순환 할 수 있습니다. 라이브러리는 크로스 플랫폼 (Linux, OS X, FreeBSD, OpenBSD, Windows)입니다. 예:

pgcli-Python 프롬프트 툴킷

(이미지 출처 : pcgli )


1

게시 된 답변은 잘 작동하지만 직장에서 작성한 자동 완성 라이브러리를 오픈 소스했습니다. 우리는 프로덕션에서 한동안 사용해 왔으며 빠르고 안정적이며 사용하기 쉽습니다. 데모 모드도있어 단어를 입력 할 때 얻을 수있는 내용을 빠르게 테스트 할 수 있습니다.

설치하려면 다음을 실행하십시오. pip install fast-autocomplete

예를 들면 다음과 같습니다.

>>> from fast_autocomplete import AutoComplete
>>> words = {'book': {}, 'burrito': {}, 'pizza': {}, 'pasta':{}}
>>> autocomplete = AutoComplete(words=words)
>>> autocomplete.search(word='b', max_cost=3, size=3)
[['book'], ['burrito']]
>>> autocomplete.search(word='bu', max_cost=3, size=3)
[['burrito']]
>>> autocomplete.search(word='barrito', max_cost=3, size=3)  # mis-spelling
[['burrito']]

체크 아웃 : https://github.com/wearefair/fast-autocomplete for the source code.

작동 원리에 대한 설명은 다음과 같습니다. http://zepworks.com/posts/you-autocomplete-me/

맞춤법 오류를 처리하고 선택적으로 단어의 가중치에 따라 정렬합니다. ( burrito이보다 더 중요 하다고 가정 해 봅시다 book. 그러면 burrito더 높은 "개수"가 주어 지고 이전에 먼저 표시됩니다.book 하면 결과에 .

단어는 사전이며 각 단어는 컨텍스트를 가질 수 있습니다. 예를 들어 "개수", 단어 표시 방법, 단어 주변의 다른 컨텍스트 등이 있습니다.이 예제에서 단어에는 컨텍스트가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.