Machine Learning 코드를 볼 때 자주 보이는 argparse 모듈에 대해서 알아보자.
argparse 모듈은 명령창(터미널)에서 실행하는 것이 원칙이다. jupyter notebook이나 대화형 실행 framework에서는 제대로 실행되지 않을 수 있다.
그래도 사용하고 싶다면arg = parser.parse_args()
를args = parser.parse_args(args=[])
로 바꿔서 사용할 수 있다.
python train.py --epochs 50 --batch-size 64 --save-dir weights
위와 같이, python 파일명 옵션들
과 같이 실행시키기 때문에 argparse에 대한 이해가 필요하다.
import argparse
parser = argparse.ArgumentParser(description='테스트')
#원하는 만큼 인자값 추가
parser.add_argument('--mode',default='train',type=str,help='모드가 무엇')
#파싱
args = parser.parse_args()
#출력
print(args.mode)
$python3 test.py -h
test.py --mode test --epochs 30
import argparse
# creating a parser
parser = argparse.ArgumentParser()
# adding arguments
parser.add_argument()
#parsing arguments
args = parser.arse_args()
prog : 프로그램의 이름값 (default : sys.argv[0])
description : -h/--help 전에 표시되는 텍스트
epilog : -h/--help 후에 표시되는 텍스트
usage : 프로그램 사용법 설명 (default : parser에 추가된 인수에서 생성)
parents : ArgumentParser의 리스트이며 이 들의 인자가 포함된다. (여러 파서가 공통된 인자를 공유 하는 경우)
formatter_class : -h/--help 출력시 사용자 정의를 위한 클래스
add_help : 파서에 -h/--help 옵션을 추가
name or flags : 옵션의 이름 또는 리스트 ('-f', '--foo')
parser.add_argument('-f', '--foo')
parser.add_argument('bar')
-
로 optional과 positional을 구분action : 명령행에서 수행할 action
을 지정
'store'
import argparser
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args=parser.parse_args('--foo 1'.split())
print(args)
>>> Namespace(foo='1')
'store_const'
import argparser
parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='store_const', const=10)
args=parser.parse_args(['--foo'])
print(args)
>>> Namespace(foo=10)
'store_true'/ 'store_false'
import argparser
parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='store_true')
parser.add_argument('--bar', action='store_false')
parser.add_argument('--baz', action='store_false')
args=parser.parse_args('--foo --bar'.split())
print(args)
>>> Namespace(foo=True, bar=Fasle, barz=True)
'append' : 옵션을 여러번 지정할 수 있도록 함
import argparser
parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='append')
args=parser.parse_args('--foo 1 --foo 2'.split())
print(args)
>>> Namespace(foo=['1', '2'])
'append_const' : const키워드 인수로 저장된 값을 추가
import argparser
parser = argparse.ArgumentParser()
parser.add_argument('--str', action='append_const', const=str, dest='types')
parser.add_argument('--int', action='append_const', const=int, dest='types')
args=parser.parse_args('--str --int'.split())
print(args)
>>> Namespace(types=[<class 'str'>, <class 'int'>])
'count' : 키워드 인수가 발생한 회수를 계산
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', action='count', default=0)
parser.parse_args(['-vvv'])
>>> Namespace(verbose=3)
'version'
parser = argparse.ArgumentParser(prog = 'Myprogram')
parser.add_argument('--version', action='version', version='%(prog)s 2.0')
parser.parse_args(['-version'])
>>> Myprogram 2.0
N(정수)
, ?
, *
, +
)N
: 명령줄의 인수의 개수를 지정
parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs=2)
parser.add_argument('bar', nargs=1)
parser.parse_args('c' --foo a b'.split())
>>> Namespace(bar=['c'], foo=['a', 'b'])
?
: 명령줄 인수가 없으면 default, optional argument의 경우 문자열이 있지만 인수가 뒤따르지 않으면 const 값이 생성
parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs='?', const='c', default='d')
parser.add_argument('bar', nargs='?', default='d')
parser.parse_args(['XX', '--foo', 'YY'])
>>> Namespace(bar='XX', foo=['a', 'b'])
parser.parse_args(['XX', '--foo'])
>>> Namespace(bar='XX', foo='c')
parser.parse_args([])
>>> Namespace(bar='d', foo='d')
*
: 모든 명령줄 인수를 저장
parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs='*')
parser.add_argument('--bar', nargs='*')
parser.add_argument('baz', nargs='*')
parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
const : append_const
,store_const
, nargs
에 필요한 상수값
default : 명령줄의 인수가 없는 경우 사용해야 하는 값을 지정
type : 명령줄 인자들이 변환되어야 하는 형태를 지정 (open()의 FileType 제공)
parser = argparse.ArgumentParser()
parser.add_argument('foo', type=int)
parser.add_argument('bar', type=open)
parser.parse_args('2 temp.txt'.split())
>>> Namespace(bar=<_io.TextIOWrapper name='temp.txt' encoding='UTF-8'>, foo=2)
choices : 인자로 허용되는 값의 컨테이너
required : 명령줄 옵션을 생략할 수 있는지 아닌지 선택할 때 (True시 필수)
metaver : 사용 메시지에 사용되는 인자의 이름
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
parser.add_argument('bar')
parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
parser.print_help()
usage: [-h] [--foo FOO] bar
positional arguments:
bar
options:
-h, --help show this help message and exit
--foo FOO
metavar를 사용하여 대체 이름을 지정할 수 있음
parser = argparse.ArgumentParser()
parser.add_argument('--foo', metavar='YYY')
parser.add_argument('bar', metavar='XXX')
parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
parser.print_help()
usage: [-h] [--foo YYY] XXX
positional arguments:
XXX
options:
-h, --help show this help message and exit
--foo YYY
parse_args()
시 반환되는 객체에 추가될 속성이름긴 옵션의 문자열에 값을지정, 긴 옵션 문자열이 제공되지 않으면 첫 번째 짧은 옵션 문자열에 값을 지정한다.
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--foo-bar', '--foo')
parser.add_argument('-x', '-y')
parser.parse_args('-f 1 -x 2'.split())
>>> Namespace(foo_bar='1', x='2')
parser.parse_args('--foo 1 -y 2'.split())
>>> Namespace(foo_bar='1', x='2')
dest는 사용자 정의 attribute name을 제공한다.
parser = argparser.ArgumentParser()
parser.add_Argument('--foo', dest='bar')
parser.parse_args('--foo XXX'.split())
Namespace(bar=XXX)