argparse란 프로그램에 필요한 인자를 사용자 친화적인 명령행 인터페이스로 쉽게 작성하도록 돕는 라이브러리 이다. 즉, command 창에서 프로그램 내의 인자를 조절하게끔 도와준다. 참고로 argparse는 python에 기본적으로 내장되어 있다. 

 

command 창에서 [ python main.py --mode test ] 와 같이 --을 이용하여 추가적인 명령어를 사용하는 것을 흔하게 볼 수 있는데, 이것이 바로 argparse를 사용한 예시이다. 

 

argparse를 잘 알고있다면, 코드의 변화를 최소화 시키는 효율적인 코드를 작성할 수 있다. 

 

 

 

 

 

1. parser 의 전체적인 흐름

 

##main.py 

import argparse

#파서 만들기
parser = argparse.ArgumentParser(description='Argparse example')

#인자 추가하기
parser.add_argument('--learning_rate', '-lr', type=float, default=0.001, help='learning rate')
parser.add_argument('--mode', type=str, defualt='train', choices=['train', 'test'])
parser.add_argument('--no_gpu', action='store_true')
parser.add_argument('--epochs', type=int, required=True, help='number of epochs')

#내가 쓴 인자 저장
args = parser.parse_args()

#인자 사용
lr = args.lr

 

먼저 argparse를 import 한다. 

 

ArgumentParser를 이용하여 파서를 만들 때 'description= ' 키워드를 이용하여 해당 프로그램에 대한 설명을 넣는다. 보통 기능과 작동 방식에 대한 간략한 설명을 제공한다. 

 

그 후 add_argument() method를 이용하여 프로그램에 필요한 인자들을 정의한다. 

 

마지막으로 parse_args() method로 명령창에서 주어진 인자들을 파싱한다.  파싱이 무엇인지는 아래에 다시 설명하도록 하겠다. 

 

args.lr과 같이 args로부터 인자들을 받아 사용 가능하다. 

 

 

 

 

 

2. add_argument() 메서드

 

name or flags : 인자의 이름 지정

 

인자의 이름을 정할 때, --help, -h와 같이 fullname과 약자를 동시에 지정할 수 있다. 

##main.py 
parser.add_argument('--learning_rate', '-lr')

 

여기서 인자의 앞에 -- , - 가 붙어 있으면 optional 인자 (선택형 인자) , 붙어있지 않으면 positional 인자(위치형 인자) 이다. 위치형 인자는 필수적으로 입력해야 하는 인자이며, 선택형 인자도 required=True를 통해 필수로 입력하게끔 지정할 수는 있다.

 

인자가 여러개 있을 때, positional 인자는 순서를 지켜 입력해야 하며, optional 인자는 순서를 지키지 않아도 괜찮다. 

##main.py

import argparse

parser = argparse.ArgumentParser(description='Argparse example')
parser.add_argument('mode', type=str, choices=['train', 'test'])
parser.add_argument('-lr', type=float, default=0.01)
args=parser.parse_args()

print('args.mode : ', args.mode)
print('args.lr : ', args.lr)


##command 창

#가능
>python main.py train -lr 0.1
args.mode :  train
args.lr :  0.1

>python main.py -lr 0.1 train
args.mode :  train
args.lr :  0.1

#불가
#positional 인자는 인자 이름 없이 value값만 순서대로 써줘야 한다. 
>python main.py mode train -lr 0.1
usage: main.py [-h] [-lr LR] {train,test}
main.py: error: argument mode: invalid choice: 'mode' (choose from 'train', 'test')

 

 

 

type & default : 인자의 type, default 값 지정

 

인자가 int, float, str, bool 등 어떤 type인지 지정한다. default type은 str이다.

default=를 통해 사용자가 옵션을 주지 않았을 때 기본적으로 들어가는 값을 지정해 놓는 것이 좋다. 

##main.py 
parser.add_argument('--learning_rate', '-lr', type=float, default=0.01)

 

 

 

action : 인자의 저장 방식

 

우리가 command창을 통해 인자와 값을 적어 주었을 때, 이것을 코드가 해석하는 방식을 지정해 주는 것이 action이다. 여기서 드디어 파싱의 개념이 나온다.  기본값은 store 이다. 

 

  • store : action 인자의 default 값이다. 인자 이름+스페이스바 후에 나오는 값을 인자의 값으로 저장한다. = 파싱

#command에서 입력 후
>python main.py -lr 0.1

#main.py 에서 아래 코드가 호출 될 때
...
args = args.parse_args()
...
# parse_args() method 내에서 '-lr 0.1'.split() 가 일어나며 -lr에 0.1이 저장된다. 이것이 파싱이다. 

 

  • store_const : const 키워드 인자에 지정된 값을 저장한다. 

##main.py 

import argparse

parser = argparse.ArgumentParser(description='Argparse example')
parser.add_argument('-lr', action = 'store_const', const=0.1)
args = parser.parse_args()

print('args.lr : ', args.lr)


##command

>python main.py
args.lr : None

>python main.py -lr
args.lr : 0.1

 

  • store_true, store_false : 각각 True, False 값을 저장하는 store_cost의 일종이다. const를 따로 쓰지 않아도 const에 각각 True, False 값이 저장된다. 

##main.py 

import argparse

parser = argparse.ArgumentParser(description='Argparse example')
parser.add_argument('--gpu', action = 'store_true') #--gpu 불리면 True
parser.add_argument('--cpu', action = 'store_false') #--cpu 불리면 False
args = parser.parse_args()

print('args.gpu : ', args.gpu)
print('args.cpu : ', args.cpu )


##command

>python main.py
args.gpu :  False
args.cpu :  True

>python main.py --cpu
args.gpu :  False
args.cpu :  False

>python main.py --gpu
args.gpu :  True
args.cpu :  True

>python main.py --gpu --cpu
args.gpu :  True
args.cpu :  False

 

  • append : 리스트를 저장하고 인자가 불릴 때마다 리스트에 값을 추가한다. 

##main.py
...
parser.add_argument('--cls', action = 'append')
...


##command
>python main.py --cls cat --cls dog
args.class :  ['cat', 'dog']

 

  • append_count : 리스트를 저장하고 const 키워드 인자로 지정된 값을 리스트에 추가한다. 

##main.py 

import argparse

parser = argparse.ArgumentParser(description='Argparse example')
parser.add_argument('--str', dest = 'types', action = 'append_const', const = str)
parser.add_argument('--int', dest = 'types', action = 'append_const', const = int)
args = parser.parse_args()

print(args)


##command
>python main.py
Namespace(types=None)

>python main.py --str
Namespace(types=[<class 'str'>])

>python main.py --str --int
Namespace(types=[<class 'str'>, <class 'int'>])

 

  • count : 키워드 인자가 등장한 횟수를 계산한다. 

##main.py
...
parser.add_argument('--verbose', '-v', action='count', default=0)
...


##command

>python main.py -vv
args.verbose :  2

 

 

 

nargs : 인자의 값 개수 지정

 

보통 하나의 인자당 하나의 값이 들어온다. nargs는 한 인자에 여러개의 값이 들어올 수 있게끔 한다. 

  • nargs=1 : 1개가 들어간 리스트를 만드는 것으로 nargs를 지정하지 않은 기본값과는 다른다. 

  • nargs='?' : const, default와 함께 사용되며, command에서 '인자 값'으로 불러 값을 저장해주는 것도 가능하고, command에서 인자만 불러 const값으로 저정도 가능하며, command에서 부르지 않아 default값으로 저장도 가능하다. 

  • nargs='*' : 한 인자당 여러 값을 저장할 수 있다. 

  • nargs ='+' : 한 인자당 여러 값을 저장할 수 있으며 최소 1개 이상을 필요로 한다.  

##main.py
...
parser.add_argument('--zoo1', type=str, nargs=2)
parser.add_argument('--zoo_q', type=str, nargs='?', const='cat', default='dog')
parser.add_argument('--zoo_star', type=str, nargs='*')
...


##command

#nargs=2
>python main.py --zoo1 cat dog
args.zoo1 :  ['cat', 'dog']

#nargs='?'
>python main.py --zoo_q
args.zoo_q :  cat

>python main.py
args.zoo_q : dog

>python main.oy --zoo_q lion
args.zoo_q : lion

#nargs='*'
>python main.py --zoo_star cat dog lion
args.zoo_star :  ['cat', 'dog', 'lion']

 

 

 

choices : 인자 값의 범위 지정

 

정해진 값들 중 하나가 선택되어야 할 때 유용하게 쓰인다. 

##main.py
...
parser.add_argument('--mode', type=str, choices=['train', 'valid', 'test'])
...


##command

>python main.py --mode valid
args.mode :  valid

>python main.py --mode next
main.py: error: argument --mode: invalid choice: 'next' (choose from 'train', 'valid', 'test')

 

 

 

required : 선택형 인자를 필수로 

 

생략되면 안되면 인자에 대하여 필수로 지정하도록 한다. optional 인자에 쓰인다. 

parser.add_argument('--device', type=str, choices=['train', 'valid', 'test'], required=True)

 

 

 

help : 인자의 설명 제공

 

인자에 대한 설명을 쓴다. command창에서 --help를 입력할 경우 각 인자에 대한 help가 출력된다. 

##main.py
...
parser.add_argument('--device', type=str, choices=['train', 'valid', 'test'], required=True, help='choose 1 task')
...


##command
>python main.py --help
optional arguments:
  -h, --help            show this help message and exit
  --device {train,valid,test}
                        choose 1 task
  

 

 

 

 

 

 

3. parse_args() 

 

command 창에서 받은 문자열을 객체로 변환하여 namespace의 attribute로 설정하는 것이 parse_args()를 호출함으로써 이루어진다. namespace는 object의 서브 클래스로 vars(args)를 통해 args를 딕셔너리 형태로 볼 수 있다. 

 

'Python' 카테고리의 다른 글

Pandas  (0) 2021.03.08

+ Recent posts