본문 바로가기

DATA SCIENCE/Study

PYTHON Interface Option : argv와 flags, 그리고 argparse

# 01. Python Interface Option 

PYTHON 코드를 실행시키기 위한 방법의 하나로 인터페이스를 통해 특정 변수를 추가하는 방법이 있다.

대표적인 방법(라이브러리)으로는 세 가지가 있으며 다음과 같다.

1. sys.argv
2. argparse
3. absl.flags & absl.app

이에 대해 하나씩 간단하게 사용법과 특징을 익혀보고, 추가적인 사항이 생긴다면 업데이트 하겠다.

 

# 02. Tutorial0.py : 공통 코드

이번 포스팅의 주목적은 python의 interface option을 통한 변수 입력이기에 다음과 같이 간단한 코드를 구현했다.

now = "" # 이 부분에 변수를 부여해 다음의 코드가 작동한다

if now.lower() == "morning" :
    print("Good Morning!")
elif now.lower() == "afternoon" :
    print("Good Afternoon~")
elif now.lower() == "night" :
    print("Good Night.")
else :
    print("Good day~")

now라는 변수를 받아 그에 걸맞는 인삿말을 출력하는 간단한 코드이다.

만약 사전에 가정한 값 [morning, afternoon, night]에 해당사항이 없다면 else를 통해 Good day를 출력한다.

이에 대한 실행 코드 및 결과화면은 다음과 같다.

Tutorial0.py 실행 화면

 

#03. Tutorial1.py : sys.argv

sys.argv의 사용법은 간단하다. 순서에 맞게 적절한 값을 입력만 하면 된다.

그러면 이후 sys.argv에 python 혹은 python3로 입력한 이후의 옵션에 대한 값이 공백을 기준으로 나뉘어(split), 리스트 형태로 가져올 수 있게 된다.

해당 코드와 코드의 실행 화면은 다음과 같다.

"""
WAY 01 : sys.argv 사용
각 변수에 대한 순서가 엄격하게 지켜져야 함
"""

import sys

print(sys.argv)

now = sys.argv[1]

if now.lower() == "morning" :
    print("Good Morning!")
elif now.lower() == "afternoon" :
    print("Good Afternoon~")
elif now.lower() == "night" :
    print("Good Night.")
else :
    print("Good day~")

tutorial1.py의 실행화면

위의 command line을 살펴보면 python을 통해 실행시키는 코드 외에 실행할 파이썬 파일 경로를 지정하는 tutorial.py 외에도 그 뒤에 공백을 두고 입력한 값들이 sys.argv로 입력된 것을 확인할 수 있다.

때문에 만약 그 뒤로 첫 번째 값을 가져온다는 코드(now = sys.argv[1])를 통해 우리가 원하는 바대로 정상적인 실행이 가능하다.

다만 sys.argv는 입력한 값을 순서대로 가져오기에, 여러 변수를 입력해야 할 경우 그 순서가 엄격히 지켜져야 한다는 점은 단점으로 작용할 수 있다. 또한 333과 같이 숫자로 입력한 값에 대해서도 string 타입으로 가져오기에, 만일 문자형 외의 데이터 타입으로 사용하고자 한다면 추가적인 처리가 필요하기도 하다.

 

# 04. Tutorial2.py : argparse

두 번째로는 argparse 라이브러리이다. 내가 가장 선호하는 라이브러리인데, 그 이유는 범용성이 높기 때문.

해당 라이브러리가 absl을 대체하기 위해 나온 것인지, 아니면 엔지니어 영역에서의 기타 차이가 있는지는 모르겠으나 일반적으로 사용하기엔 가장 편리하다.

우선 코드를 살펴보면 다음과 같다.

"""
WAY 02 : argparse 사용
- python 코드가 실행되며 외부로부터 변수를 받아오는 과정에서 범용적으로 사용 가능
"""

# STEP 01. Import Library
import argparse

# STEP 02. Declare 'parser'
parser = argparse.ArgumentParser(description="지금이 언젠지에 따라 하는 인사입니다.")

# STEP 03. Set the arguments
parser.add_argument('now', default='', type=str, help='지금이 언제쯤일까요? [morning/afternoon/night/else]')

# parser.add_argument('-now', default='', type=str, dest="time", help='지금이 언제쯤일까요? [morning/afternoon/night/else]')

# STEP 04. Call Args
args = parser.parse_args()

now = args.now

if now.lower() == "morning" :
    print("Good Morning!")
elif now.lower() == "afternoon" :
    print("Good Afternoon~")
elif now.lower() == "night" :
    print("Good Night.")
else :
    print("Good day~")

코드를 살펴보면 argparse 라이브러리는 임포트하는 단계를 포함해 크게 네 단계를 통해 구현할 수 있다.

그 단계는 위에서 설명한 바와 같이 1) 라이브러리를 임포트하고, 2) argparse의 우리가 사용할 기능인 Parser를 선언하며, 3) 구체적으로 무엇을 사용할 것인지 받을 변수명, 형태, 사용하기 위한 이름 등을 입력한 뒤, 4) 최종적으로 이를 활용하기 위한 Namespace 형태로 입력한 변수들을 저장해 가지고 있는다.

 

라이브러리를 임포트하는 첫 번째 단계와 이후 진행될 parser에 대한 설명(description)을 작성해 -h 명령어로 다음과 같이 help 기능을 지원하는 것은 간단히 결과화면만 보여주고 스킵하도록 하겠다.

ArgumentParser의 Description 기능

세 번째 단계가 우리가 집중할 단계인데, 모든 변수나 사용법을 익히기보다 우선 바로 사용할 수 있게 핵심적인 내용만 정리하도록 하겠다.

가장 기본적인 add_argument 사용

add_argument를 통해 인터페이스 변수를 입력방법은 크게 세 가지가 있는데, 우선 첫 번째는 위와 같이 사용하는 방법이 있다.

 

① name : 해당 변수명을 정하는 영역이다. 이는 command line에서 굳이 입력하지 않아도 되며, 실제 코드에서 사용하는 변수명이다. 만약 위와 같다면 변수명은 args.name 과 같이 지정된다.

② data type : 입력받은 데이터의 타입을 지정한다.

③ help : 해당 argument에 대한 설명이다.

 

첫 번째 방법으로 사용했을 경우, 마치 sys.argv를 사용했던 것과 유사하게 사용할 수 있다.

sys.argv와 같이 입력된 순서에 따라 arguments가 들어오는 것은 동일하지만, namespace에 저장되면서 우리가 설정한 'now'라는 변수(name)로 불러올 수 있다는 것.

따라서 실행코드 뒤에 'morning'을 넣어주면 다음과 같이 실행된다.

첫 번째 방법으로 실행한 결과

위의 코드를 보면 now라는 변수를 지정해서 넣어주고자 하였으나, 그조차도 그대로 가져와 now라는 변수(name)에 저장한 것을 확인할 수 있다.

또한 이러한 첫 번째 방법은 sys.argv와 달리 반드시 입력해야 하는 값으로 입력하지 않으면 다음과 같은 에러를 일으킨다.

첫 번째 방법을 사용했을 경우엔 반드시 인수를 입력해야 한다

 

 

두 번째 방법은 대시("-")를 사용하는 것이다.

정확히는 대시를 한 번 사용하는가, 두 번 사용하는가의 차이가 있는데 아직 내 숙련도가 이 둘을 명확히 구분할 정도로 높지는 않아 구분하지 않고 설명하겠다. 추후 이에 대해 명확히 구분할 수 있게 되면 업데이트할 예정.

add_argument의 두 번째 사용 방법

대시를 사용하는 방식으로 name을 정의하는 과정을 통해 위의 세 가지에 해당하는 변수를 추가로 정의내리는 것이 가능하다.

 

① name : 해당 변수명을 정하는 영역이다. 이는 command line에서 입력해야 한다. 이를 통해 순서에 구애받지 않고 입력할 수 있다.

② default : 만일 해당 변수가 입력되지 않았을 경우 사용할 기본값을 지정한다.

③ dest : destination의 준말로, 사용한 변수명과 다르게 namespace에 저장될 name을 변경할 수 있다. 위의 예시에선 입력할 땐 time이지만, 실제로는 now로 받게 된다. 참고로 dest를 입력하지 않는다해서 변수가 '-time'이 되진 않는다. 대시가 빠진 'time'으로 지정된다.

 

이를 통한 사용법은 다음과 같다.

 

1) 아무런 값도 입력하지 않았을 경우 : default가 지정되어 있다면 default값으로, 그렇지 않을 경우 None을 값으로 갖는다.

사용법 1

2) 인수에 맞는 값을 입력한 경우 : 해당 값을 인수로 받아 지정한 dest 혹은 name으로 사용할 수 있다.

사용법 2

 

이후 Flags 라이브러리에 대해서는 추후 다시 다루도록 하겠다.

'DATA SCIENCE > Study' 카테고리의 다른 글

Docker : npm install error  (0) 2022.05.02
WSL에서 Docker 사용  (0) 2022.05.01
Windows10에서 WSL2 로컬 디렉토리 사용법  (0) 2022.02.25
MLOps란 무엇인가?  (0) 2022.02.22
WSL2 환경에서 WEBCAM 사용  (0) 2022.01.06