Argparse 모듈?
run.py 라는 파이썬 스크립트가 있을 때 명령 프롬프트에서 다음과 같이 실행 가능
$ python ./run.py
만약 어떤 옵션
에 따라서 파이썬 스크립트가 다르게 동작
하도록 해주려면 인자
를 입력해야함. 입력한 인자를 파싱
한 후 인자 값에 따라 적당한 동작을 수행해줘야 합니다. 이처럼 인자를 파싱할 때 사용하는 모듈
이 바로 argparse
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--epoch', type=int, default=150)
parser.add_argument('--batch_size', type=int, default=128)
parser.add_argument('--lr_initial', type=float, default=0.1)
args = parser.parse_args()
print(args.epoch)
print(args.batch_size)
print(args.lr_initial)
# 터미널에서 다음과 같이 인자를 설정할 수 있다.
$ python run.py --epoch=256 --batch_size 64 --lr_initial 0.1
ArgumentParser 객체
prog - 프로그램의 이름 (기본값: sys.argv[0])
- 참고로 sys.argv[0] 에는 해당하는 스크립트가 놓여지는 장소가 저장된다.
- sys.argv[1] 에는 처리할 파일 이름이 놓인다.
- 기본적으로 argument parser은 sys.argv[0] 을 사용하여 도움말 메시지에 프로그램의 이름을 표시한다.
- parser = argparse.ArgumentParser(prog='myprogram')
위와 같이 prog를 설정할 경우
- parser.print_help() 의 결과 myprogram [-h] 으로 이름이 재 설정 된다.
- %(prog)s 포맷 지정자를 사용해서 도움말에 쓸 수도 있다.
parser.add_argument('--foo', help='foo of the %(prog)s program')
usage - 프로그램 사용법을 설명하는 문자열 (기본값: 파서에 추가된 인자로부터 만들어지는 값)
- parser = argparse.ArgumentParser(prog='PROG'. usage='%(prog)s [options]')
- usage 또한 재정의 가능.
description - 인자 도움말 전에 표시할 텍스트 (기본값: none)
- parser = argparse.ArgumentParser(description='A foo that bars')
epilog - 인자 도움말 후에 표시할 텍스트 (기본값: none)
- parser = argparse.ArgumentParser(epilog="And that's how you'd foo a bar")
- parents - ArgumentParser 객체들의 리스트이고, 이 들의 인자들도 포함된다
- 때로 여러 바서가 공통 인자 집합을 공유하는 경우가 있다.
- 반복정의하는 대신, 모든 공유인자를 갖는 파서를 ArgumentParser 에 parents= 인자로 전달할 수 있다.
- parent_parser = argparse.ArgumentParser(add_help=False)
- parent_parser.add_argument('--parent', type=int)
- foo_parser = argparse.ArgumentParser(parents=[parent_parser])
- argparse.RawDescriptionHelpFormatter
- argparse.RawTextHelpFormatter
- argparse.ArgumentDefaultsHelpFormatter
- argparse.MetavarTypeHelpFormatter
prefix_chars - 선택 인자 앞에 붙는 문자 집합 (기본값: - ).
- -f /--foo 같이 앞에 붙는 접두사를 다른 것으로 바꿀 수 있다.
fromfile_prefix_chars - 추가 인자를 읽어야 하는 파일 앞에 붙는 문자 집합 (기본값: None).
- 긴 인자 목록을 다룰 때, 인자 목록을 명령행에 입력하는 대신 파일에 보관하는 것이 좋다.
- fromfile_prefix_chars= 인자는 말 그대로, 지정된 문자로 시작하는 인자는 파일로 간주하고 파일에 포함된 인자로 대체한다.
- with open('args.txt', 'w') as fp: fp.write('-f\nbar')
- parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
- parser.add_argument('-f')
- parser.parse_args(['-f', 'foo', '@args.txt'])
위의 ['-f', 'foo', '@args.txt'] 식은 ['-f', 'foo', '-f', 'bar'] 와 동등하게 취급된다.
argument_default - 인자의 전역 기본값 (기본값: None)
conflict_handler - 충돌하는 선택 사항을 해결하기 위한 전략
- 같은 옵션 문자열을 가진 두 개의 액션을 허용하지 않기 때문에 예전인자를 대체할 수 있다.
- conflict_handler = 'resolve'
add_help - 파서에 -h/--help 옵션을 추가합니다 (기본값: True)
allow_abbrev - 약어가 모호하지 않으면 긴 옵션을 축약할 수 있도록 합니다. (기본값: True)
add_argument() 메서드
action - 명령행에서 이 인자가 발견될 때 수행 할 액션의 기본형.
- 'store' - 인자 값을 저장. 기본 액션.
- 'store_const' - const 키워드 인자에 의해 지정된 값을 저장.
- 'store_true' / 'store_false' - 각각 true 와 false 를 저장.
- store_true로 설정했을때 옵션을 주게 되면 true, 아니면 false로 설정됨, store_false는 store_true의 반대개념
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-a" , "--actual" , type=int , default = 10)
parser.add_argument("-epoch" , type=int , default = 100)
parser.add_argument("-lr" "--learing_rate" , type=float , default = 1e-4)
parser.add_argument("-flag" , action='store_true')
opt = parser.parse_args()
opt = vars(opt)
def a(**kward):
print(kward.keys())
print(kward.values())
if __name__ == "__main__":
a(**opt)
$ python run.py -flag # flag옵션 지정 시 true로 저장
# 만약 -flag 옵션을 주지 않으면 false로 저장하고 있음.

- 'append' - 리스트를 저장하고 각 인자 값을 리스트에 추가.
- 'count' - 키워드 인자가 등장한 횟수를 계산.
- 'help' - 현재 파서의 모든 옵션에 대한 완전한 도움말 메시지를 출력하고 종료한다.
- 'version' - add_argument() 호출에서 version= 키워드 인자를 기대하고, 호출되면 버전 정보를 출력하고 종료한다.
- 'extend' - 리스트로 저장하고 각 인자 값으로 리스트를 확장한다.
nargs - 입력되어야 하는 인자의 수.(number + args)
예제1 nargs = 1
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--name', nargs=1)
args = parser.parse_args()
print(args.name)
위의 예제에서 --name 옵션은 하나의 argument를 입력받아야 하고, 입력받은 것은 args.name에 리스트 형태로 하나의 요소가 저장된다.
예제 2 nargs = '+'
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--numbers', nargs='+')
args = parser.parse_args()
print(args.numbers)
위의 예제에서 --number 옵셥은 한개 또는 그 이상의 argument
를 입력받아야 하고 입력받은 값은 args.numbers에 list 형태로 저장 여러값을 입력할 때에는 , 없이 입력
하면 됨
> $ python main.py --numbers a b 10

예제3 nargs = '*' , nargs = 2
- narg = '*' 은 0개 또는 그 이상의 argument를 입력받아야 하고 나머지는 '+'와 동일
- narg=2 인경우는 옵션의 인자가 2개를 입력받아야 한다.(1개 , 3개 이상 부터 오류)
default - 옵션을 주지 않았을 때의 default 값
type : 옵션을 주어야 하는 type을 결정
- int , float , bool , str으로 설정할 수 있으며 터미널에서 지정한 type과 다른 값을 준 경우 오류 발생
참고 : https://docs.python.org/ko/3/library/argparse.html
참고 : https://supermemi.tistory.com/entry/%EB%A8%B8%EC%8B%A0-%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8%EC%97%90%EC%84%9C-argparse-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%A0%9C