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!
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 면 색 비활성
click CLI 두 서브커맨드 — greet (이름 + --count int) 와 farewell (이름 + --formal 플래그). 부모엔 @click.group(). 도움말 텍스트. python tool.py greet alice --count 3 와 python tool.py farewell bob --formal 실행 테스트. python tool.py --help 가 둘 다 보여주는지 확인.
Progress
Progress is local-only — sign in to sync across devices.