IT/언어

[python] ArgumentParser(argpaser)의 사용법 간단 정리

개발자 두더지 2020. 5. 20. 01:32
728x90

 Python의 실행시에 커맨드로 인수를 얻고 싶을 때, ArgumentPaser(argpaser)을 사용하면 편리하다. 다양한 형식으로 인수를 지정하는 것도 가능하다. 

 처음 argparse를 사용하고자하여 여러 포스팅을 읽어봤지만 자세한 옵션까지 해설한 포스팅이 많아 정작 하고 싶은 방법을 간단히 하는 방법을 알 수 없었던 기억이 있다. 필요한 최소한의 내용을 정리하여, 다른 사람들도 금방 읽고 적용하도록 할 수 있도록 하면 좋을 것 같다고 생각하여 작성하는 포스팅이다.


1. ArgumentParser이란?

 프로그램 실행시 커맨드로 인수를 얻는 처리를 간단하게 구현할 수 있는 라이브러리이다. ArgumentParser를 사용하면,

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

위와 같이, 프로그램으로 처리하고 싶은 파일명이나 어떠한 파라미터를 실행시 지정할 수 있다.


2. 사용법

 

1) 기본형

1. argparse를 임포트한다.
2. parser를 만든다.
3. 인수를 지정한다.
4. 분석한다.

대충 위와 같은 처리를 프로그램의 제일 처음에 실행한다.

# test.py

 # 1. argparseをインポート
import argparse   

# 2. パーサを作る (parser작성)
parser = argparse.ArgumentParser(description='このプログラムの説明(なくてもよい)')    

# 3. parser.add_argumentで受け取る引数を追加していく
parser.add_argument('arg1', help='この引数の説明(なくてもよい)') # 必須の引数を追加(필수항목을 추가)
parser.add_argument('arg2', help='foooo')
parser.add_argument('--arg3')    # オプション引数(指定しなくても良い引数)を追加 (옵션 인수;지정하지 않아도 괜찮은 인수 추가)
parser.add_argument('-a', '--arg4')   # よく使う引数なら省略形があると使う時に便利 (잘 사용하는 인수라면, 생략형이 있다면 사용시 편리하다)

# 4. 引数を解析 (인수를 분석)
args = parser.parse_args()

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

 

(1) 필수 인수

add_argument로 인수명을 'arg'와 같이 지정하는 것이 보통이다.

실행시 인수를 지정하는 순서가 결정돼 있으므로 지정할 때, 잊어버리면 에러가 발생한다.

 

(2) 옵션 인수

인수명을 '-a'나 '--alpha'와 같이 하이픈('-')을 1~2개 붙인다.

하이픈의 수는 인수명이 1문자일 경우 ㅂ개, 그 이상일 경우는 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)    # エラー

 


 

2) 응용편

 

(1) 디폴트값(기본값)을 설정하고 싶은 경우

디폴트 인수로 지정하지 않은 경우에 'None'이 되지만, 'None'이아닌 다른 디폴트 값을 지정하는 것이 가능하다.

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

위 코드를 실행할 때 '--message'가 지정되어 있지 않은 경우 'None'대신에 'hello!'가 된다. 

 

(2) 형을 지정하고 싶은 경우

커맨드라인 인수로 지정된 값의 디폴트 자료형은 문자열형이다.

→ 정수값이나 실수값을 지정하고 싶은 경우!

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]

 

(3) flag로써 사용하고 싶은 경우

add_argument에 action을 지정하는 것으로 flag로 사용할 수 있게 된다.

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', 그렇지 않다면 'False'가 된다.

인수로써 구체적인 값을 지정하지 않고, 그 인수를 지정하는 또는 하지 않는 것에 의미를 가지게 하고 싶은 경우 사용할 수 있다.

덫붙여서 action = 'store_false'로 작성하면 반대가 된다. (지정한 경우 False) 

 

(4) 지정 내용을 옵션 중에서 선택하도록 하고 싶은 경우

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

choice로 리스트를 전달해 인수의 선택지를 그 리스트 안에서만 선택할 수 있도록 하여, 그 외를 지정한 에러가 발생되도록 한다. 

앞서 설명한 '--help'를 통해 지정가능한 것이 무엇인지 확인이 가능하다.

 

(5) (정해지지 않은) 여러 개의 결과를 얻고 싶은 경우

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

nargs="*"를 지정하면 가변길이로 여러 개의 리스트형식을 받아올 수 있게 된다.

'*'대신에 정수를 지정하면 고정된 길이가 된다.

 

(6) 옵션 인수이지만 필수로 지정하고 싶은 경우

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

나의 경우 위에 언급했듯 필수 인수인 경우 순서가 중요하기 때문에, 원하는 순서로 지정할 수 있도록 이 기능을 자주 사용하는 편이다. 

parser.add_agument("-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