바이오 대표

[py.click] click pakage로 python package 만들기 본문

Python/others

[py.click] click pakage로 python package 만들기

바이오 대표 2023. 6. 12. 03:25

Python package “Click: command line interface creation kit“

Click 패키지는 command line interfaces를 이쁘게 작성할 수 있게 도와주는 툴이다. 또한 CLI API 에서 생기는 문제들을 예방하고 보다 빠르고 재미있게 코드를 짤수있도록 도와주고 크게 3가지 장점이 있다.

  • arbitrary nesting of commands
  • help page 를 자동생성
  • supports lazy loading of subcommands at runtime
# test.py 코드
import click

@click.command()
@click.option('--count', default=1, help='Number of greetings.') # help='' 에 작성하는 메세지가 --help에 뜬다.
@click.option('--name', prompt='Your name', # 코드를 실행하면 'Your name:' 메세지가 뜬다. 이름 입력후, function process.
              help='The person to greet.')
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times.""" # 해당 메세지가 --help 에 뜬다. 
    for x in range(count):
        click.echo(f"Hello {name}!")

if __name__ == '__main__':
    hello()
# test.py 실행
$ python test.py --count=3
Your name: bro  # 위의 코드를 치면 Your name: 에 이름 넣어줄 수 있다.
Hello bro! 
Hello bro!
Hello bro!
$ python test.py --help
	Simple program that greets NAME for a total of COUNT times.

Options:
  --count INTEGER  Number of greetings.
  --name TEXT      The person to greet.
  --help           Show this message and exit.

 

실제 모듈 만들기 + Details

Step 0. 가상환경 실행

# $ pip install virtualenv --user
$ virtualenv venv   # -> directory 'venv' generated
$ . venv/bin/activate 
$ pip install click

 

Step 1. Setup.py 설정 및 스크립트 작성

from setuptools import setup

setup(
    name='helloword',
    version='1.0',
    py_module=['hello'], # hello 로 부를 수 있는 모듈을 만드는 것.
    install_requires=[
        'Click',
    ],
    entry_points=""" 
        [console_scripts]
        hello=hello:cli  # hello 에서 cli 라는 function 실행 
    """
)
import click

@click.command()
@click.option('--repeat', default=1, #click.option() 은 - or --로 시작해야한다.
              help="How many times you should be greeted")
@click.option('--string', default="World", 
							help="This is the thing that is greeted")
@click.argument('out', type=click.File("w"), default="-", required=False)  # defulat는 mandantory 이고, input 그대로 유지, , help 만들수 없다(애초에 very specific)
def cli(string, repeat,out):
	"""This scripts greets you."""
    for x in range(repeat):
        click.echo(f'Hello {string}!', file=out) # click function 사용할때는 print(f'Hello {string}!') 말고 echo 추천
        
if __name__ == '__main__':
    cli()

 

Step 2. 모듈 만들기

pip install --editable . 
# -e, --editable Install a project in editable mode (i.e.  setuptools "develop mode") from a local project path or a VCS url. 

 

Step 3. 모듈 실행

$ hello --string help

 

다른 function 추가

  • @click.group()
import click

@click.group()
def cli():
    pass

@cli.command()
@click.option('--repeat', default=1, #click.option() 은 - or --로 시작해야한다.
              help="How many times you should be greeted")
@click.option('--string', default="World", 
							help="This is the thing that is greeted")
@click.argument('out', type=click.File("w"), default="-", required=False)  # defulat는 mandantory 이고, input 그대로 유지, , help 만들수 없다(애초에 very specific)
def say(string, repeat,out):
	
    """This scripts greets you."""
    
    # click.echo(out)
    for x in range(repeat):
        click.echo(f'Hello {string}!', file=out)  # file= 파일 열고 write 해줌, cli사용시 print()말고 echo 추천
        
if __name__ == '__main__':
    cli()
$ python hello_group.py 
Usage: hello.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  say  This scripts greets you. # say라는 command function 을 부를 수 있다.

$ python hello_group.py say --help
Usage: hello.py say [OPTIONS] [OUT]

  This scripts greets you.

Options:
  --repeat INTEGER  How many times you should be greeted
  --string TEXT     This is the thing that is greeted
  --help            Show this message and exit.

 

 

other Reference 

argparse vs click? https://click.palletsprojects.com/en/8.1.x/