본문 바로가기
C.W.K.
Stream
Lesson 02 of 04 · published

Click — 데코레이터로 CLI 조립하기

~18 min · click, cli, decorator

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

Click은 함수에 명령·인자·선택 항목 데코레이터를 붙여 CLI를 선언해. 타입 변환, 기본값, 입력 질문, 비밀번호 입력, 일관된 오류와 도움말을 제공하므로 argparse의 파서 연결보다 읽기 쉬운 경우가 많아.

@click.group() 아래에 명령을 등록하면 하위 명령 구조가 돼. Choice, 실제로 존재하는 Path, 여러 번 받는 값 같은 타입이 검증을 맡고, echo·secho·confirm은 터미널을 알아보는 출력과 확인 질문, 색을 다뤄. 셸 자동 완성과 시험 도구도 갖춰 배포할 명령행 응용 프로그램에 잘 맞아.

다만 데코레이터가 함수 서명과 같은 정보를 반복할 수 있어. 표준 라이브러리만 쓰는 작은 도구면 argparse가 충분하고, 타입 힌트 중심 프로젝트라면 다음 수업의 Typer가 더 자연스러울 수 있어.

Code

가장 작은 Click 명령·python
# pip install click
import click

@click.command()
@click.argument("name")
@click.option("--count", default=1, type=int, help="인사 횟수.")
@click.option("--shout", is_flag=True)
def hello(name, count, shout):
    """NAME 한테 count 번 인사."""
    msg = f"Hello, {name}!"
    if shout:
        msg = msg.upper()
    for _ in range(count):
        click.echo(msg)

if __name__ == "__main__":
    hello()

# python tool.py alice --count 3 --shout
# HELLO, ALICE!
# HELLO, ALICE!
# HELLO, ALICE!
그룹 아래에 하위 명령 등록하기·python
import click

@click.group()
def cli():
    """내 CLI 도구."""
    pass

@cli.command()
@click.argument("name")
def add(name):
    """사용자 추가."""
    click.echo(f"adding {name}")

@cli.command()
@click.argument("name")
def remove(name):
    """사용자 제거."""
    click.echo(f"removing {name}")

if __name__ == "__main__":
    cli()

# python tool.py add alice
# python tool.py remove bob
# python tool.py --help            서브커맨드 보여줌
# python tool.py add --help        서브커맨드 도움말 보여줌
Path·Choice·여러 값 선택 항목·python
import click

@click.command()
@click.argument("input", type=click.Path(exists=True))
@click.option("--mode", type=click.Choice(["dev", "prod"]), default="dev")
@click.option("--tag", multiple=True, help="여러 번 지정 가능")
def cli(input, mode, tag):
    click.echo(f"input: {input}")
    click.echo(f"mode: {mode}")
    click.echo(f"tags: {list(tag)}")

# python tool.py /etc/hostname --mode prod --tag a --tag b
# input: /etc/hostname
# mode: prod
# tags: ['a', 'b']

# Path(exists=True) 자동 검증
색 출력과 대화형 입력 질문·python
import click

@click.command()
def interactive():
    name = click.prompt("이름")
    age = click.prompt("나이", type=int)

    if click.confirm(f"{name}, {age} 살 맞아?", default=True):
        click.secho(f"Hello {name}!", fg="green", bold=True)
    else:
        click.secho("취소.", fg="red")

# tty vs piped 자동 처리 — stdout이 터미널이 아니면 색 비활성

External links

Exercise

Click으로 greet와 farewell 하위 명령을 만들어. greet는 이름과 --count 정수, farewell은 이름과 --formal 플래그를 받고 부모는 @click.group()을 써. 도움말 문장을 넣고 greet alice --count 3, farewell bob --formal, --help를 실행해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.