IT/언어

[python] ArgumentParser 사용법

개발자 두더지 2021. 8. 2. 23:12
728x90

개요


 Python의 실행시에 커맨드 라인 인수를 다룰 때, ArgumentParser(argparse)를 사용하면 편리하다. 다양한 형식으로 인수를 지정하는 것이 가능하다.

 처음에 argparse를 사용할 생각으로 여러가지 포스팅을 살펴보았지만, 자세한 옵션까지 설명하고 있는 포스팅이 많아서 간단한 사용법을 알기 어려웠기 때문에 여기서는 간단하게 바로 시작할 수 있는 필요한 최소한의 내용에 대해 정리하고자 한다.

 

 

ArgumentParser이란?


 

 프로그램을 실행시에 커맨드 라인에 인수를 받아 처리를 간단히 할 수 있도록 하는 표준 라이브러리이다. ArgumentParser를 사용하면,

$ python program.py test.txt --alpha 0.01

 위와 같이, 프로그램에서 처리할 수 있는 파일명이나 어떠한 파라미터등을 실행시에 지정할 수 있다.

 

 

사용법


기본

1. argparse를 import한다.

2. parser를 만든다.

3. 인수를 설정한다.

4. 분석한다.

위의 일련의 처리를 프로그램을 맨 처음에 실행한다.

import argparse    # 1. argparse를 import한다.

parser = argparse.ArgumentParser(description='이 프로그램의 설명(그 외 기타등등 아무거나)')    # 2. parser를 만든다.

# 3. parser.add_argument로 받아들일 인수를 추가해나간다.
parser.add_argument('arg1', help='이 인수의 설명(그 외 기타등등 아무거나)')    # 필요한 인수를 추가
parser.add_argument('arg2', help='foooo')
parser.add_argument('--arg3')    # 옵션 인수(지정하지 않아도 괜칞은 인수를 추가
parser.add_argument('-a', '--arg4')   # 자주 사용하는 인수라면 약칭이 있으면 사용할 때 편리하다

args = parser.parse_args()    # 4. 인수를 분석

print('arg1='+args.arg1)
print('arg2='+args.arg2)
print('arg3='+args.arg3)
print('arg4='+args.arg4)

실행 예

$ python test.py input.txt output.txt --arg3 11111 -a 22222
arg1=input.txt
arg2=output.txt
arg3=11111
arg4=22222

인수를 어떻게 지정했는지 깜빡했을 때는 실행시 -h 혹은 --help를 지정하면 아래와 같이 정보를 확인할 수 있다.

$ python test.py -h
usage: test.py [-h] [--arg3 ARG3] [-a ARG4] arg1 arg2

이 프로그램의 설명(그 외 기타등등 아무거나)

positional arguments:
  arg1                  이 인수의 설명(그 외 기타등등 아무거나)
  arg2                  foooo

optional arguments:
  -h, --help            show this help message and exit
  --arg3 ARG3
  -a ARG4, --arg4 ARG4

필수 인수

 add_argument로 인수명을 'arg'와 같이 일반적으로 지정하면 arg가 된다. 실행 시에 인수를 지정하는 순서는 정해져 있으므로 지정하는 것을 잊어버리면 에러가 된다.

 위 예의 arg1와 arg2가 그 예이다.

옵션 인수

 인수명을 '-a' 혹은 '--alpha'와 같이 하이픈('-')을 하나 혹은 두개를 붙이면 옵션 인수가 된다. 하이픈의 수는 인수명이 한 문자인 경우에는 1개, 2개 이상의 문자수를 가진 인수명인 경우는 2개를 붙이는 듯하다.

 실행할 때는 지정해도 지정하지 않아도 좋다(지정하지 않은 경우에는 None이 된다). 지정하는 순서도 자유이다.

 또한, 자주 사용하는 인수라면 정식 명칭과 약칭을 함께 붙여서 아래와 같이 미리 정의해두면 편리하다.

parser.add_argument('-i', '--input')

 이렇게 정의해두면 실행시에 -i를 쓰던 --input를 쓰던 상관없다. 다만 프로그램 코드내에서는 정식 명칭만 사용할 수 있다.

parser.add_argument('-i', '--input')
args = parser.parse_args()
print(args.input)    # OK
print(args.i)    # 에러

 

응용

디폴트값을 지정하고 싶을 때

 옵션 인수로 지정되지 않은 경우에는 None이 된다고 앞서 얘기했었다. 이 경우 None이 아닌 다른 기본값을 설정하고 싶은 경우 아래와 같이 작성할 수 있다.

parser.add_argument('--message', default='hello!')

 이렇게 정의해두고 실행시에 --message가 지정되지 않은 경우에는 None이 아닌 'hello!'가 된다.

데이터 형을 지정하고 싶을 때

 커맨드 라인 인수로 지정된 값은 기본적으로 데이터형은 문자열이다. 따라서 정수형이나 실수형으로 지정하고 싶은 경우 다음과 같이 작성할 수 있다.

parser.add_argument('--number', type=int)    # 인수형(int)
parser.add_argument('--alpha', type=float, default=0.01)    # 실수형(float)

 이렇게 작성해두면, 지정도니 값은 int나 float로 자동적으로 변환된다.

 또한, type 인수에는 문자형으로 부터 원하는 형태로 변환하는 함수에 건내주는 등 여러가지 방법이 있다.

예를 들어, '.' 으로 구분된 숫자를 지정한 리스트에서 저장하고 싶은 경우

tp = lambda x:list(map(int, x.split('.')))
parser.add_argument('--address', type=tp, help='IP address')

args = parser.parse_args()
print(args.address)
$ python test.py --address 192.168.31.150
[192, 168, 31, 150]

플래그로써 사용하고 싶을 때

add_argument에 action을 지정하면 플래그로 사용할 수 있다.

parser.add_argument('--flag', action='store_true')
args = parser.parse_args()
print(args.flag)
$ python test.py
False
$ python test.py --flag
True

 실행시에 --flag가 지정되어 있는 경우 True, 그렇지 않으면 Flase가 된다. 인수로써 구체적인 값을 지정하는 것이 아닌, 그 인수를 지정하는 or하지 않는 것에 의미를 갖게 하고 싶을 경우에 사용할 수 있다.

 한편 action='store_false'를 하면 반대가 된다 (지정하면Flase가 된다)

지정한 내용을 선택지 중에서 선택할 수 있게 하고 싶은 때

parser.add_argument('--fruit', choices=['apple', 'banana', 'orange'])

choices에 리스트를 지정하면 인수의 선택지를 그 안에 있는 것만으로 한정할 수 있어, 그 외에 다른 값을 지정하면 에러가 된다.

헬프 옵션으로 (--help)로 무엇을 지정할 수 있는지 확인할 수 있다.

여러 개 데이터(정해지지 않은 데이터)를 다루고 싶을 때

parser.add_argument('--colors', nargs='*')
args = parser.parse_args()
print(args.colors)
$ python test.py --colors red green blue
['red', 'green', 'blue']

nargs='*'를 지정하면 가변 길이의 여러 개의 데이터를 리스트 형식으로 받을 수 있다. '*'의 대신에 정수형으로 지정하면 고정 길이로도 할 수 있다.

옵션 인수이지만 필수 지정으로 하고 싶을 때

required=True로 지정하면 필수 지정의 옵션 인수를 만들 수 있다. 

parser.add_argument("-a", required=True)
args = parser.parse_args()
print(args.a)
$ python test.py -a hoge
hoge
$ python test.py
usage: test.py [-h] -a A
test.py: error: argument -a is required

참고자료

https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0

728x90