파이썬 click 사용하기

허정·2022년 10월 5일
0

아래의 링크를 참고해서 파이썬의 click 도구를 사용하는 방법에 대해 알아보겠습니다.

https://click.palletsprojects.com/en/7.x/quickstart/

1. Creating a command

  • click은 데코레이터를 통해 command를 선언할 수 있습니다.
  • non-decorator interface가 있긴 하지만, 심화된 버전입니다.

(1) @click.command()

  • click.command()를 사용하면, 함수는 Click command line tool이 됩니다.
  • 간단히 말해서, 이 데코레이터를 사용해서 함수를 데코레이팅하면 callable script가 됩니다.
import click

@click.command()
def hello():
  click.echo('Hello World!')
  • 데코레이터가 함수를 Command로 바꿔준 것입니다.
if __name__ == '__main__':
  hello()

실행해보면,

$ python hello.py
Hello World!

(2) Nesting Commands

  • Command들은 type Group의 다른 command들에 붙을 수 있습니다.
  • This allows arbitrary nesting of scripts
@click.group()
def cli():
    pass

@click.command()
def initdb():
    click.echo('Initialized the database')

@click.command()
def dropdb():
    click.echo('Dropped the database')

cli.add_command(initdb)
cli.add_command(dropdb)
  • 여기서 group() 데코레이터가 command() 데코레이터랑 비슷하게 작동하는 것을 볼 수 있습니다
  • 그런데, Group object를 만든다는 것이 다릅니다

마지막으로 setuptools entry point에서 Group을 호출할 수 있습니다.

if __name__ == '__main__':
  cli()

(3) Adding Parameters

  • parameter를 추가하기 위해서, option()과 argument() 데코레이터를 사용합니다.
@click.command()
@click.option('--count', default=1, help='number of greetings')
@click.argument('name')
def hello(count, name):
    for x in range(count):
        click.echo(f"Hello {name}!")

2. Options

(1) Basic Value options

  • 가장 기본적으로 쓰이는 옵션이 value option입니다
  • 옵션은 value인 하나의 인자를 받습니다
@click.command()
@click.option('--n', default=1)
def dots(n):
    click.echo('.' * n)
# How to make an option required
@click.command()
@click.option('--n', required=True, type=int)
def dots(n):
    click.echo('.' * n)
# How to use a Python reserved word such as `from` as a parameter
@click.command()
@click.option('--from', '-f', 'from_')
@click.option('--to', '-t')
def reserved_param_name(from_, to):
    click.echo(f"from {from_} to {to}")
  • --help를 통한 default 값을 보이게 하고 싶다면, 다음과 같이 show_default=True를 사용합니다
@click.command()
@click.option('--n', default=1, show_default=True)
def dots(n):
    click.echo('.' * n)

3. Prompting

@click.command()
@click.option('--name', prompt=True)
def hello(name):
    click.echo(f"Hello {name}!")
$ hello --name=John
Hello John!
$ hello
Name: John
Hello John!

default prompt string이 맘에 들지 않는다면, 다음과 같이 사용할 수 있습니다.

@click.command()
@click.option('--name', prompt='Your name please')
def hello(name):
    click.echo(f"Hello {name}!")

4. Dynamic Defaults for Prompts

  • auto_envvar_prefix 와 default_map 옵션을 사용해서 context가 environment나 configuration file로부터 option value를 읽을 수 있게 합니다.
  • 중요한 것은 이것을 사용하면 prompting mechanism을 override 하기 때문에, user는 value를 interactively 바꿀 수 없습니다.

0개의 댓글