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)입니다.예:
(이미지 출처 : 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
'programing' 카테고리의 다른 글
PowerShell 스크립트의 파일 시스템 위치를 얻으려면 어떻게 해야 합니까? (0) | 2023.09.10 |
---|---|
XML 스키마 파일에서 xs와 xsd의 차이점은? (0) | 2023.09.10 |
PowerShell을 사용하여 파일에 탭 쓰기 (0) | 2023.09.10 |
XML에 내포된 주석? (0) | 2023.09.10 |
SELECT * 열의 MySQL 별칭 (0) | 2023.09.10 |