코드로 우주평화

Click _ argument, option으로 인자 전달하기 본문

나는 이렇게 학습한다/Library

Click _ argument, option으로 인자 전달하기

daco2020 2022. 8. 21. 21:12
반응형

Click 이란?

click은 커맨드 명령 환경에서 Python 스크립트에 인자를 넣을 수 있도록 도와주는 라이브러리이다.

 

예를 들어 하나의 스크립트가 날짜에 따라 동작이 달라져야 한다고 가정해보자. 우리는 이를 위해 날짜별로 스크립트를 만들어야 할까? 만약 그렇게 하면 매일 '오늘의 스크립트'를 새로 만들어야 할 것이다.

 

click은 이러한 문제를 쉽게 해결해준다. 스크립트에 날짜를 인자로 넣어 하나의 스크립트만으로 모든 날짜에 대한 동작을 수행할 수 있도록 도와주기 때문이다.

 

 

이번 글에서는 간단한 예시로 click 사용법을 익혀보자.

 

 

 

 

Click 사용법

 

1. 설치하기

pip install click

터미널에서 명령어로 click 패키지를 설치한다.

 

 

2. click 라이브러리 가져오기

# practice_click.py

import click

실행하려는 스크립트에 click을 Import 한다. 

 

 

 

3. 기본 command 데코레이터 사용하기

@click.command() 
def  main () : 
    print( "가보자고!" )

main() # 스크립트 실행시 main함수 실행

함수를 작성하고 스크립트를 실행하면 “가보자고!”가 출력된다. 여기까지는 기존 스크립트와 동일하다.

 

 

 

4. argument 데코레이터로 DateTime 타입 받기

from datetime import datetime # type hint를 위해 불러옴

@click.command() 
@click.argument("dt", type=click.DateTime(["%Y-%m-%d"])) 
def  main (dt: datetime) : 
    print( f" {dt. date()} 가보자고!" )

@click.argument 데코레이터를 추가했다. 이제 해당 스크립트는 "dt" 인자를 받을 수 있다.

 

데코레이터 안에 “dt”는 main함수의 dt 파라미터를 의미한다.

 

데코레이터 안에 “type”은 받은 인자를 datetime 타입으로 가져오는 것을 의미한다.

 

실행

>>> python practice_click.py 2020-08-08
2020-08-08 가보자고!

 

스크립트를 실행하면 위의 결과가 나온다. 실행 명령 오른쪽에 “dt”에 해당하는 인자를 넣으니 해당 스크립트가 인자를 올바르게 인식한다.

 

 

 

Usage: practice_click.py [OPTIONS] [%Y-%m-%d]
Try 'practice_click.py --help' for help.

Error: Missing argument '[%Y-%m-%d]'.

만약 인자를 넣지 않으면 '[%Y-%m-%d]' 형식의 argument가 필요하다는 에러가 발생한다. @click.argument 데코레이터의 경우 지정한 인자를 필수로 받기 때문이다.

 

 

5. argument 데코레이터로 Choice 선택지 받기

@click.command()
@click.argument("dt", type=click.DateTime(["%Y-%m-%d"]))
@click.argument("who", type=click.Choice(["혼자", "함께"]))
def main(dt: datetime, who: str):
    print(f"{dt.date()}, {who} 가보자고!")

argument 데코레이터를 추가하였다.

 

이번에는 인자 이름이 ‘who’이다. main함수의 파라미터에도 명시하는 것을 잊지 말자.

 

type에는 Choice를 사용했다. Choice는 배열에 담긴 요소들 중에서만 인자를 받을 수 있음을 나타낸다.

 

 

 

실행

>>> python practice_click.py 2020-08-08 혼자
2020-08-08, 혼자 가보자고!

커맨드 명령으로  ‘2020-08-08’ 과 ‘혼자’ 두 개의 인자를 넣었다. 스크립트는 성공적으로 값을 출력했다. 

 

 

 

>>> python practice_click.py 2020-08-08 엄마
Usage: practice_click.py [OPTIONS] [%Y-%m-%d] {혼자|함께}
Try 'practice_click.py --help' for help.

Error: Invalid value for '{혼자|함께}': '엄마' is not one of '혼자', '함께'.

만약 잘못된 값을 인자로 넣으면 선택지에 없다는 에러를 발생시킨다 🙂

 

 

6. option 데코레이터로 argument 대체하기

@click.command()
@click.option("--dt", required=True, type=click.DateTime(["%Y-%m-%d"]))
@click.option("--who", required=True, type=click.Choice(["혼자", "함께"]))
def main(dt: datetime, who: str):
    print(f"{dt.date()}, {who} 가보자고!")

이번에는 @click.argument 대신 @click.option 데코레이터를 사용하였다.

 

 

option 데코레이터의 경우 인자를 필수로 받지 않기 때문에 필수로 받기 위해 'required=True'라는 옵션을 추가로 넣어주었다.

 

또한 인자 이름에도 dash를 붙여 '—dt', '—who'로 변경해주었다. (dash를 앞에 적음으로서 '—dt'가 실제 인자가 아닌 위치를 알려주는 인자임을 나타낸다)

 

 

 

실행

>>> python practice_click.py --dt 2020-08-08 --who 함께
2020-08-08, 함께 가보자고!

argument 데코레이터를 사용했을 때와의 차이점은 위치 인자인 '—dt', '—who'가 추가된 것이다.

 

보통 주입하려는 인자가 여러 개일 경우, 실무에서는 option을 더 많이 사용하는데 option의 경우 위치 인자를 통해 더 정확한 명령어를 입력할 수 있기  때문이 아닐까 싶다.

 

 

 

 

 

 

마무리

앞서보았듯 click을 사용하면 Python 스크립트에 인자를 주입할 수 있다. 이 글에서 설명한 것은 click의 일부분이므로 더 다양한 타입과 옵션을 커스텀하여 사용하고 싶다면 아래 공식문서를 참고하길 바란다.

 

 

Welcome to Click — Click Documentation (8.1.x)

 

click.palletsprojects.com

반응형