본문 바로가기
Python

[Typer] Python으로 CLI App 만들기

by llHoYall 2024. 3. 30.

TyperFastAPI를 만든 곳에서 만든 CLI app을 만들수 있도록 도와주는 라이브러리입니다.

FastAPI도 사용성이 너무 좋았었는데, Typer도 역시 너무 맘에 들어서 이렇게 소개를 드립니다.

Installation

먼저 필요한 패키지를 설치합니다.

$ pip install "typer[all]"

Rich라는 패키지도 설치가 되는 데 이것도 아주 재밌는 패키지라서 app 만들 때 종종 사용하려고 합니다. ㅎㅎ

Create a First Example

간단히 사용 예제를 보여드릴게요.

import typer

def main(name: str):
    print(f"Hello {name}")

if __name__ == "__main__":
    typer.run(main)

argparse 같은 내장 패키지를 사용할 때보다 훨씬 간단하죠?

typer.run()으로 묶어준 것 뿐인데 벌써 CLI app이 완성되었어요.

실행을 시켜보면 요렇게 이미 기본 구조가 완성되어서 사용자에게 사용법도 알려줍니다.

시킨대로 --help 옵션을 주면 깔끔하게 도움말을 보여줍니다.

사용법에 맞게 실행을 하면 원하는대로 함수가 실행되요.

Upgrade the Example

앱을 확장하여 조금 더 복잡한 예제를 보여드리겠습니다.

import typer

app = typer.Typer()

@app.command()
def hello(name: str):
    print(f"Hello {name}")

@app.command()
def goodbye(name: str, formal: bool = False):
    if formal:
        print(f"Goodbye Mr. {name}. Have a good day.")
    else:
        print(f"Bye {name}!")

if __name__ == "__main__":
    app()

이번에는 2개의 명령을 만들었습니다.

typer.Typer()를 사용하여 app을 생성하고, 이 app 객체를 사용한 것이 가장 큰 차이점입니다.

등록한 명령어 2개가 보이고, 기본 옵션에 보면 app을 바로 설치할 수 있게 만들어 주기도 하고, 자동 완성기능도 사용할 수 있네요.

각각의 명령어의 도움말을 출력해볼게요.

기본값을 가진 인자가 어떻게 보이는지도 확인할 수 있죠?

새로 만든 명령어도 사용해 보았습니다.

Special Feature

이 외에도 유용하게 사용할 수 있는 기능들을 많이 제공하고 있는데, 그 중에서도 개인적으로 CLI 앱을 만들 때 자주 사용하게 되는 프로그레스 바를 한 번 보여드릴게요.

import time

import typer
from rich.progress import track

def main():
    total = 0
    for value in track(range(100), description="Processing..."):
        time.sleep(0.01)
        total += 1
    print(f"Processed {total} things.")

if __name__ == "__main__":
    typer.run(main)

이제, 실행을 시켜볼까요?

 

마지막으로, loading을 나타내는 것을 보여드릴게요.

웹이나 외부 프로그램과의 통신이 필요한 경우에 종종 사용하는 건데, 그동안은 ... 등으로만 표현해왔는데 Typer에서는 이것도 예쁘게 보여줄 수 있습니다.

import time

import typer
from rich.progress import Progress, SpinnerColumn, TextColumn

def main():
    with Progress(
        SpinnerColumn(),
        TextColumn("[progress.description]{task.description}"),
        transient=True,
    ) as progress:
        progress.add_task(description="Processing...", total=None)
        progress.add_task(description="Preparing...", total=None)
        time.sleep(5)
    print("Done!")

if __name__ == "__main__":
    typer.run(main)

실행을 시키면 요렇게 보입니다.

Wrap Up

이번에는 Python에서 CLI app을 만들 때 유용한 Typer라는 패키지를 소개해 드렸습니다.

개인적으로 이걸 알게된 이후로 CLI는 무조건 이걸로만 만들 정도로 좋아하는 거라서 다른 분들께도 꼭 소개드리고 싶었어요. 😆

'Python' 카테고리의 다른 글

[Python] FFI with Rust  (0) 2024.07.22
[Flet] Getting Started  (0) 2024.07.12
[Python] PyPI에 패키지 배포하기  (3) 2024.03.16
[FastAPI] Getting Started  (0) 2023.09.13
[PyQt6] Save and Load Settings using QSettings  (0) 2023.04.06

댓글