programing

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

powerit 2023. 9. 10. 13:09
반응형

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

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

  • 구글은 이것을 어떻게 하는지에 대한 설명을 위해 많은 히트를 보여줍니다.
  • 안타깝게도 관련 자료가 너무 많아서 제가 해야 할 일을 찾기가 어렵고 약간 다릅니다.

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

저의 구체적인 사용 사례는 이메일을 보내야 하는 명령줄 파이썬 프로그램입니다.사용자가 전자 메일 주소의 일부를 입력하고 선택적으로 TAB 키를 누르면 전자 메일 주소(디스크에 주소가 있음)를 자동으로 완료할 수 있습니다.

윈도우나 맥에서 작동하는 데 필요한 것이 아니라 리눅스만 있으면 됩니다.

Python'sreadline제본예를들면,

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)

공식 모듈 문서는 훨씬 더 상세하지 않습니다. 자세한 내용은 읽기 라인 문서를 참조하십시오.

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)

질문에서 "NOT Interpreter"라고 하시니 python readline 등의 답변을 원하지 않으실 것 같습니다.(편집: 나중에 생각해보면, 그건 분명히 사실이 아닙니다. 흥. 어쨌든 정보가 흥미로운 것 같아서 여기에 남겨둘게요.)

생각엔 당신이 이걸 노릴 수도 있을 것 같아요.

이것은 임의의 명령에 셸 수준의 완성을 추가하여 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.

링크된 페이지의 예시를 확인해 보세요. 모든 것이 아주 간단합니다.

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'))

여기 에피멘틱에 의해 매우 많이 공급된 코드의 풀 작동 버전이 있습니다(감사합니다).

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
# ~/.pythonrc
import rlcompleter, readline
readline.parse_and_bind('tab:complete')

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

Python에서 대화형 명령줄 응용 프로그램을 구축하기 위한 라이브러리인 Python Prompt Toolkit을 사용해 볼 수 있습니다.

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

pgcli - Python Prompt Toolkit

(이미지 출처 : pcgli)

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

설치하려면 다음을 실행하기만 하면 됩니다.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/seperman/fast-autocomplete .

그리고 이것은 어떻게 작동하는지에 대한 설명입니다: http://zepworks.com/posts/you-autocomplete-me/

그것은 철자를 잘못 쓰고 단어의 무게에 따라 선택적으로 정렬하는 것을 다룹니다.예를 들면burrito합니다더 보다 더 합니다.book, 그러면 당신이 주시오burrito "트 와 그 "에 "저 "날 "입니다 앞에 먼저 나타납니다.book

단어는 사전이고 각각의 단어는 문맥을 가질 수 있습니다.예를 들어 "카운트", 단어를 표시하는 방법, 단어 주변의 다른 맥락 등입니다.이 예제에서는 단어에 문맥이 없었습니다.

이거 잘 되네요.

#!/usr/bin/python3

import readline
readline.parse_and_bind("tab: complete")

def complete(text,state):
    volcab = ['dog','cat','rabbit','bird','slug','snail']
    results = [x for x in volcab if x.startswith(text)] + [None]
    return results[state]

readline.set_completer(complete)

line = input('prompt> ')

언급URL : https://stackoverflow.com/questions/187621/how-to-make-a-python-command-line-program-autocomplete-arbitrary-things-not-int

반응형