본문 바로가기
Study/Python

python argparse를 사용하여 커맨드 라인 인자 처리하기

by 개발새-발 2021. 8. 4.
반응형

python을 notebook형식이 아닌 .py 파이썬 파일 형식으로 커맨드상에서 실행하는 경우들이 존재한다. 이 경우 프로그램 실행 시에 커맨드 라인상에서 인자를 전달해야 하는 경우가 있다. 예를 들어 아래와 같이 커맨드에서 실행하도록 한다고 해보자.

python train.py resnet

또는 더 많은 인자를 주어서 아래 처럼 실행하는 것도 가능하다고 하자.

python train.py resnet --epochs 777 --batch-size 64

--epoches, --batch-size는 타이핑하기 길기 때문에 -e, -b로 짧게 인자를 넘기는 것도 가능하게 하고 싶다.

python train.py resnet -e 777 -b 64

위처럼 작동하게 하고 싶다면, 커맨드 라인 (command line)상에서 전달받은 인자를 argparse를 이용하여 처리하면 편하다.

argparse 사용법

argparse를 이용하여 커맨드라인 인자(command line arguments)를 처리하고 사용하는 데에는 크게 4가지 단계로 나눌 수 있다.

  1. argparse.ArgumentParser 생성하기
  2. ArgumentParser에 인자 추가하기
  3. ArgumentParser로 인자 parse 하기
  4. parse 된 인자 사용하기

아래 코드를 보자.

import argparse

if __name__ == '__main__':
    # 1. create parser
    parser = argparse.ArgumentParser(description='This is argparse example python program.')

    # 2. add arguments to parser
    parser.add_argument('model')
    parser.add_argument('--epochs', '-e', type=int, default=10, help='Number of epoch to train.')
    parser.add_argument('--batch-size', '-b', type=int, default=16, help='Size of batch')

    # 3. parse arguments
    args = parser.parse_args()

    # 4. use arguments
    print(args)
    print('model :',args.model)
    print('epochs :',args.epochs)
    print('batch-size :',args.batch_size)

ArgumentParser는 기본적으로 help 내용을 생성하고, 이를 -h, --help 옵션으로 볼 수 있도록 한다. -h 옵션을 주어 프로그램을 실행시켰을 때 아래와 같은 내용이 출력된다.

  • 프로그램 실행
python train.py -h
  • 출력
usage: train.py [-h] [--epochs EPOCHS] [--batch-size BATCH_SIZE] model

This is argparse example python program.

positional arguments:
  model

optional arguments:
  -h, --help            show this help message and exit
  --epochs EPOCHS, -e EPOCHS
                        Number of epoch to train.
  --batch-size BATCH_SIZE, -b BATCH_SIZE
                        Size of batch

이제 단계별로 천천히 살펴보자.

argparse.ArgumentParser 생성하기

ArgumentParser는 아무런 인자도 넘겨주지 않고서도 생성이 가능하다.

parser = argparse.ArgumentParser()

몇가지 값을 전달하여 생성해 줄 수도 있다. 간단하게 몇개만 정리해 보았다.

  • discription : help내용 에서 프로그램의 설명을 나타낸다.
  • usage : help내용에서 프로그램의 사용법을 나타낸다. 자동으로 생성된다.
  • prog : help 내용에서 프로그램의 이름을 나타낸다. 지정하지 않은경우, 실행시 입력하였던 프로그램 명(sys.argv[0])이 자동으로 값에 들어가게 된다.
  • epilog : help 내용 이후에 나올 내용을 나타낸다.
  • add_help : -h, --help 옵션을 추가하여 help 내용을 보여줄것인지 아닌지를 결정한다. 기본값은 True이다.
  • prefix_chars : 옵션앞에 붙는 문자를 정한다. '+'로 정한 경우 ++help 의 꼴로 인자를 부여할 수 있다.

만약 ArgumentParser를 다음과 같이 작성하였다고 하자.

parser = argparse.ArgumentParser(description='This is argparse example python program.',
                                 usage = 'python %(prog)s [OPTIONS]',
                                 prog = 'TrainProgram',
                                 epilog = '-------------- HELP ENDED HERE ------------')

이 경우 -h 옵션을 부여하여 본 help의 내용은 다음과 같다. 입력한 description과 usage, prog, epilog가 help 내용에 반영되어있는 것을 볼 수 있다.

usage: python TrainProgram [OPTIONS]

This is argparse example python program.

positional arguments:
  model

optional arguments:
  -h, --help            show this help message and exit
  --epochs EPOCHS, -e EPOCHS
                        Number of epoch to train.
  --batch-size BATCH_SIZE, -b BATCH_SIZE
                        Size of batch

그러나 아래 코드처럼 add_help=False로 설정한 후에는 -h, --help 로 help 내용을 볼 수 없다.

parser = argparse.ArgumentParser(description='This is argparse example python program.',
                                 add_help=False)

커맨드 라인에서 python train.py -h 을 실행하면 아래와 같이 출력된다. -h 옵션이 없어 help의 내용을 볼 수 없다.

usage: train.py [--epochs EPOCHS] [--batch-size BATCH_SIZE] model
train.py: error: the following arguments are required: model

ArgumentParser에 인자 추가하기

이제 처리해줄 인자들을 ArgumentParser에 추가하여 보자. 추가하는 argument는 Positional argumentOptional argument로 나눌 수 있다. 앞에서 train.py를 호출하였을 때 사용한 명령어를 보자.

python train.py resnet -e 777 -b 64

위 명령어에서 'resnet'은 Positional argument, 777과 64는 optional argument로 입력을 해준 것이다. resnet은 입력 순서를 바탕으로 model 값에 해당한다는 것을 알 수 있고, 777과 64는 -e, -b 뒤에 나온 값이기 때문에 각각 epochs와 batch-size에 해당하는 값임을 알 수 있다.

argparsePositional argumentOptional argument를 추가하는 방법은 간단하다. add_argument를 사용하면 된다. 이때, 앞에 '-' 를 붙이면 Optional argument로 추가하고, 이외의 경우에는 Positional argument로 추가하게 된다.

# positional argument
parser.add_argument('arg1')

# optional argument
parser.add_argument('--arg2','-a')

add_argument에 몇개의 인자를 더 넣어서 커맨드라인 인자를 좀 더 쉽게 처리할 수 있다. 아래는 add_argument가 받는 인자값들의 일부이다.

  • type : 기본적으로 ArgumentParser는 커맨드라인 인자를 '문자열'로 불러온다. 그러나 코드상에서 int나 float 타입으로 써야하는 경우, 원하는 타입으로 사용할 수 있게 한다. 문자열을 가공하는 함수를 넣어주어도 작동한다.

    parser.add_argument('-x',type=float)
    parser.add_argument('-y',type=int)
    parser.add_argument('-z',type=lambda s : s+'_suffix')
    # command line
    python a.py -x 11.1 -y 34 -z 'zzz'
    
    # output
    x :  11.1
    y :  34
    z :  zzz_suffix
  • default : optional argument를 입력하지 않았을 때 기본값은 None이다. None이 아닌 어떤 값을 그 인자의 기본값으로 설정하고 싶은경우 사용한다.

    parser.add_argument('-x', type=int, default=100)
    # command line
    python a.py 
    
    # output 
    x : 100 
    
    # command line 
    python a.py -x 777 
    
    # output 
    x : 777
  • help : 각 인자에 대한 설명을 넣어준다. -h 옵션으로 help의 내용을 볼 때 내용을 확인할 수 있다.

  • choice : 만약 어떤 인자의 값이 '원하는 값들중 하나' 여야 하는 경우 사용한다.

    parser.add_argument('-x',choices=['a','b','c'])
    # command line 
    python a.py  -x a
    
    # output 
    x : a
    
    # command line 
    python a.py  -x xx
    
    # output
    usage: a.py [-h][-x {a,b,c}]
    train.py: error: argument -x: invalid choice: 'xx' (choose from 'a', 'b', 'c')

이외에도 다양한 옵션이 존재한다.

ArgumentParser로 인자 parse 하고 사용하기

parse에 받아올 인자들을 설정해 주었다면 이제 커맨드 라인에서 입력된 인자를 정해준 규칙대로 불러올 순서이다. 이는 ArgumentParser에서 parse_args()를 호출하면 된다.

# parse arguments
args = parser.parse_args()

이제 parser_args() 가 반환한 args를 인자 추가할 때 입력하였던 값으로 접근하면 원하는 값을 사용 가능하다. 이때 인자 이름에 하이픈('-') 이 있었다면 이는 언더바('_')로 대체된다.

# use arguments
print('model :',args.model)
print('epochs :',args.epochs)
print('batch-size :',args.batch_size)
반응형

댓글