Python prompt-toolkit 패키지를 사용하여 대화형 cli 프로그램 만들기

오늘은 Python에서 대화형 command line interface를 만들어 주는 prompt_toolkit 패키지에 대하여 알아보려 합니다.

개요

prompt_toolkit 패키지는 파이썬에서 구현된 GNU 리드라인입니다.

GNU readline은 command line interface에서 줄 편집과 같은 역할을 하는 라이브러리입니다.

prompt_toolkit 설치

우선 virtualenv로 파이썬 환경을 분리해줍니다.

pip3 install virtualenv
virtualenv -mvenv env

env라는 이름의 가상 환경을 생성합니다.

source env/bin/activate

가상환경을 폴더에서 활성화합니다.

pip install prompt_toolkit

pip로 prompt_toolkit을 설치합니다.

포맷팅

from prompt_toolkit import print_formatted_text

print_formatted_text('Hello world')

형식을 가지고 stdout으로 출력해줍니다.

from prompt_toolkit import print_formatted_text, HTML

print_formatted_text(HTML('<b>bold</b>'))
print_formatted_text(HTML('<i>talic</i>'))
print_formatted_text(HTML('<u>underline</u>'))

위와 같이 html 태그 색상을 적용할 수 있습니다.

입력

from prompt_toolkit import prompt

text = prompt('input: ')

프롬프트를 만들어서 입력을 받을 수 있습니다.

from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
from prompt_toolkit import PromptSession
from prompt_toolkit.history import FileHistory

session = PromptSession(history=FileHistory('my_history'))

text1 = session.prompt('session input1: ',)
text2 = session.prompt('session input2: ', auto_suggest=AutoSuggestFromHistory())

세션 객체를 만들어서 연속적으로 프롬프트를 띄울 수 있습니다.

입력 히스토리는 유지됩니다.

그리고 FileHistory를 통하여 이전에 입력한 문자열을 저장할 수도 있습니다.

from prompt_toolkit.completion import WordCompleter
from prompt_toolkit import prompt

word_completer = WordCompleter(['hello', 'world', 'python'])
text = prompt('input: ', completer=word_completer, complete_while_typing=True)

completer를 설정하여 특정 단어 자동완성을 할 수 있습니다.

complete_while_typing 옵션으로 작성하는 도중에 자동완성을 활성화할 수 있습니다.

from prompt_toolkit.validation import Validator
from prompt_toolkit import prompt


def is_number(txt):
    return txt.isdigit()


validator = Validator.from_callable(
    is_number,
    error_message='non-numeric characters',
    move_cursor_to_end=True)

number = int(prompt('input: ', validator=validator))

validator에 함수를 이용하여 부합하지 않으면 error_message를 출력하게 할 수 있습니다.

대화창

from prompt_toolkit.shortcuts import message_dialog, input_dialog, yes_no_dialog, button_dialog

message_dialog(
    title='Example dialog window',
    text='Do you want to continue?\nPress ENTER to quit.')

확인만 하는 dialog를 생성할 수 있습니다.

result = yes_no_dialog(
    title='Example dialog window',
    text='Do you want to continue?')

예/아니오 버튼이 존재하는 dialog를 생성할 수 있습니다.

input_dialog(
    title='Example dialog window',
    text='input:')

입력을 받는 dialog를 생성할 수 있습니다.

button_dialog(
    title='Example dialog window',
    text='Do you want to continue??',
    buttons=[
        ('Yes', True),
        ('No', False),
    ],
)

자신이 원하는 버튼을 만들 수 있는 dialog를 생성할 수 있습니다.

진행바

from prompt_toolkit.shortcuts import ProgressBar
import time


with ProgressBar() as pb:
    for i in pb(range(100)):
        time.sleep(.01)

ProgressBar를 생성할 수 있습니다.

Written on April 11, 2019