본문 바로가기
자습

click을 이용한 python CLI

by litaro 2019. 9. 8.

https://blog.sicara.com/perfect-python-command-line-interfaces-7d5d4efad6a2

 

How to Write Perfect Python Command-line Interfaces

This article will show you how to make perfect Python command line interfaces, to improve your team productivity and comfort.

blog.sicara.com

위의 저자는 Data Science Project를 개발하는 개발자로서 Python comman-line interface를 많이 사용한다고 한다. 그래서 python이 제공하는 두가지 library를 활용해서 편의성과 팀 생산성을 향상시킬 수 있는 방법에 대해 소개한다.

나의 경우 주로 테스트를 위해 Python CLI를 사용하는데 매일 헛갈리는 부분이 사실 sys.argv를 이용하는데 어떻게 써야하는지 헛갈리고, 몇번째에 써야하는지도 파일을 결국 열어보고 확인해야하는 불편함이 있었다.

해당 글을 읽으면서 이러한 불편함을 해소할수 있는 방법을 찾은것 같아 한번 정리해보려고 한다.

The "beginners" method

일반적으로는 sys.argv를 이용해서 사용한다.

sys.argv에는 아래와 같이 list 형태로 정보들이 들어가게 되어 진짜 각각의 key (--filter, --phase)를 뽑아내려면 

$ python test_runner.py  --filter category1/ --phase 'QA'
['test_runner.py', '--filter', 'category1/', '--phase', 'QA']

아래와 같이 복잡한 코드로 for 문을 돌아가면 해당 key name이 있는지 찾아내어야 한다.

그래서 보통 귀챦아서 개발자들끼리 index를 약속해서 차례대로 하나씩 뽑아 내서 사용한다. ^^;;

argparse

python library로 제공되는 argparse를 이용하면 custom한 option 을 추가할수 있다.

https://docs.python.org/ko/3/howto/argparse.html

 

Argparse 자습서 — Python 3.7.4 문서

Argparse 자습서 저자 Tshepang Lekhonkhobe 이 자습서는 파이썬 표준 라이브러리에서 권장하는 명령행 파싱 모듈인 argparse 에 대한 소개입니다. 참고 같은 작업을 수행하는 다른 두 모듈이 있습니다, getopt (C 언어에서 getopt() 와 동등합니다) 와 폐지된 optparse. argparse 는 optparse 에 기반을 두고 있어서 사용법 면에서 매우 비슷합니다. 개념 ls 명령을 사용하여 이 입문서에서 다룰 기능들을

docs.python.org

결과는 아래와 같다. name space에 추가된것을 확인할수 있다.

$ python test_runner_argparse.py --filter category1/ --phase QA
Namespace(email=False, excel=False, filter='category1/', phase='QA')

categofy1/ False False QA
$ python test_runner_default.py --help
usage: test_runner_default.py [-h] [--filter FILTER] [--email EMAIL]
                              [--excel EXCEL] [--phase PHASE]

optional arguments:
  -h, --help            show this help message and exit
  --filter FILTER, --f FILTER
                        test를 실행한 파일 필터 : category1/, category2/device1,
                        common etc..
  --email EMAIL, --e, EMAIL
                        test 를 실행할 phase : QA/OP/ST
  --excel EXCEL
  --phase PHASE

Click

python library click을 사용해서 로직을 분리하자

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

 

Welcome to Click — Click Documentation (7.x)

 

click.palletsprojects.com

아래와 같이 argparse와 동일하게 나오는것을 알 수 있다. 특히 type을 알아서 보여주는것은 더 좋은것 같다.

$ python test_runner.py --filter category1/ --no-email
['test_runner.py', '--filter', 'category1/', '--no-email']
filter:category1/, excel:False, email:False, phase:QA

$ python test_runner.py --help
Usage: test_runner.py [OPTIONS]

Options:
  --filter, --f TEXT    test를 실행한 파일 필터 : category1/, category2/device1,
                        common etc..
  --phase, --p TEXT     test 를 실행할 phase : QA/OP/ST
  --email / --no-email  email 을 보낼지 말지 선택하는 옵션, 명시안하면 False
  --excel / --no-excel  excel로 결과를 변환할 지 여부, 명시안하면 False
  --help                Show this message and exit.

TQDM

추가로 Progress를 보여주는 tqdm을 소개했는데 내 입장에서는 딱히 쓸데가 없어서 사용법만 확인하고 넘어간다.

$ pip install tqdm

https://pypi.org/project/tqdm/

 

tqdm

Fast, Extensible Progress Meter

pypi.org

 

'자습' 카테고리의 다른 글

Flask, Flask-RESTPlus, and Swagger UI  (0) 2019.10.09
Django vs. Flask  (1) 2019.09.28
pre-commit 활용하기  (0) 2019.08.31
파이썬 클린 코드 CH3. 좋은 코드의 일반적인 특징  (0) 2019.08.17
AWS Lambda@Edge  (0) 2019.08.10