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 — third-party 인데 보편

click 이 가장 popular 한 third-party CLI 라이브러리. 데코레이터 스타일 — 함수에 @click.command(), @click.option("--name"), @click.argument("target"). 함수 파라미터가 파싱된 값 받음. 많은 경우 argparse 보다 깔끔하게 읽힘, 특히 서브커맨드.

커맨드와 그룹

@click.group() 이 서브커맨드 가진 부모 커맨드 생성. 각 서브커맨드가 @parent.command() 로 등록된 @click.command(). 계층 쉬움 — tool.py users add, tool.py users delete, tool.py reports show. CLI 구조가 함수 정의 자연스럽게 mirror.

옵션과 인자

positional 엔 @click.argument (디폴트 필수). 플래그와 named 옵션엔 @click.option. 타입/검증엔 type=int, type=click.Choice([...]), type=click.Path(exists=True). 반복 가능 플래그엔 multiple=True. 인터랙티브 입력엔 prompt=True. click 타입이 argparse 의 그냥 type=int 보다 풍부.

click.echo 와 색

click.echo("...") 가 플랫폼별 줄바꿈 처리 + 침묵/리다이렉트 능력 가진 print 감쌈. click.secho("warning", fg="yellow") 가 색깔 출력 (출력이 터미널 X 일 때 자동 비활성). click.confirm, click.prompt 가 인터랙티브 질의응답. polished UX 로 합쳐지는 작은 거.

원칙: 데코레이터 스타일 + polished UX (색, prompt, progress bar) 원할 때 click 이 맞는 디폴트. 0 의존성 원할 때 argparse. typer (다음 lesson) 가 click 위에 타입 힌트 layer + 강한 세 번째 옵션.

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 / multiple·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) 자동 검증
색과 인터랙티브 prompt·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 이 터미널 X 면 색 비활성

External links

Exercise

click CLI 두 서브커맨드 — greet (이름 + --count int) 와 farewell (이름 + --formal 플래그). 부모엔 @click.group(). 도움말 텍스트. python tool.py greet alice --count 3python tool.py farewell bob --formal 실행 테스트. python tool.py --help 가 둘 다 보여주는지 확인.

Progress

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

댓글 0

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

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