[Python] GNU readline 사용하기 Develop Tip

시스코 스위치 등에 콘솔이나 telnet 등으로 접속을 하면
단일 라인 명령을 내릴 수가 있습니다.

보통 이런 식의 단일 명령을 CLI (Command Lion Interface) 라고 합니다.
그런데 명령을 제대로 수행하는가 검증하는 파싱기능 뿐만 아니라,
그 다음 명령이 무엇인가를 tab을 눌러 알 수 있습니다.

이런 기능을 GNU의 readline 기능을 이용하여 구현할 수 있습니다.
(C 에서는 libreadline 라이브러리를 이용하면 됩니다)

물론 C로 구현할 수도 있지만,
혹여나 lex(flex)와 yacc(bison) 로 구현할라 치면 보통 쉽게 할 수 있는
정도가 아닙니다.
더군다나 거기에 readline 기능까지 넣으려면... 휴우 한숨부터 나오지요.

그런데 파이썬으로 이런 기능을 간단하게 구현할 수 있습니다.

일단은 다음 예제로 출발을 합니다.

#!/usr/bin/env python

import readline

if 'libedit' in readline.__doc__:

readline.parse_and_bind("bind ^I rl_complete") # for osx

else:

readline.parse_and_bind("tab: complete")

readline.parse_and_bind('set editing-mode vi')

COMMANDS = ['extra', 'extension', 'stuff', 'errors', 'email', 'foobar', 'foo']


def complete(text, state):

for cmd in COMMANDS:

if cmd.startswith(text):

if not state:

return cmd

else:

state -= 1


readline.set_completer(complete)

raw_input('Enter section name: ')



이제 실행을 시키고,
$ python rline.py 
Enter section name:
<탭> 키를 누르면,
email      errors     extension  extra      foo        foobar     stuff 
명령이 보이며,

Enter section name: e
<탭> 키를 누르면,
email      errors     extension  extra    

Enter section name: ext
<탭> 키를 누르면,
extension  extra    

이와 같이 다음에 나올 문자가 알아서 보이며 
단일 문자가 남았을 경우에는 자동으로 해당 단어로 확장이 됩니다.

이곳에서 부터 여러 문자열이 나오도록 하고,
상태 변이 코딩을 간단히 하면, 파싱 및 다음 나올
문자열을 자동으로 보이도록 확장할 수 있습니다.


어느분께는 도움이 되셨기를...

덧글

댓글 입력 영역

구글애드텍스트