argparse

hyunsooo·2021년 8월 2일
0

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에 대한 이해가 필요하다.

  • argparse는 python에 기본으로 내장되어 있다.
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

Example

import argparse

# creating a parser
parser = argparse.ArgumentParser()

# adding arguments
parser.add_argument()

#parsing arguments
args = parser.arse_args()

argparse.ArgumentParser()

  • prog : 프로그램의 이름값 (default : sys.argv[0])

  • description : -h/--help 전에 표시되는 텍스트

  • epilog : -h/--help 후에 표시되는 텍스트

  • usage : 프로그램 사용법 설명 (default : parser에 추가된 인수에서 생성)

  • parents : ArgumentParser의 리스트이며 이 들의 인자가 포함된다. (여러 파서가 공통된 인자를 공유 하는 경우)

  • formatter_class : -h/--help 출력시 사용자 정의를 위한 클래스

    • argparse.RawDescriptionHelpFormatter : description, epilog의 줄바꿈이 가능
    • argparse.RawTextHelpFormatter : description, epilog의 줄바꿈이 가능
    • argparse.ArgumentDefaultsHelpsFormatter : 인수들의 help 메시지에 default값을 자동으로 추가
    • argparse.MetavarTypeHelpFormatter : 인수들의 type값을 표시
  • add_help : 파서에 -h/--help 옵션을 추가

add_argument()

  • name or flags : 옵션의 이름 또는 리스트 ('-f', '--foo')

    • optional arguments : parser.add_argument('-f', '--foo')
    • positonal arguments : parser.add_argument('bar')
    • parser.parse_args()호출시 , 접두사 -로 optional과 positional을 구분
  • action : 명령행에서 수행할 action을 지정

    • 'store' : 인자 값을 저장, 기본 action
    • 'store_const' : const 키워드 인자에 의해 지정된 값을 저장
    • 'store_true', 'store_false' : true와 false를 저장
    • 'append' : 리스트를 저장하고 각 인자 값을 리스트에 추가
    • 'count' : 키워드 인자가 등장한 횟수를 계산
    • 'help' : 현재 파서의 모든 옵션에 대한 완전한 도움말 메시지
    • 'version' : add_argument()호출시 버전 정보 출력
    • 'extend' : 리스트를 저장하고 각 인자값으로 리스트를 확장

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


nargs

  • nargs : 사용해야 하는 명령줄 인수의 수 (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
  • dest : 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)

profile
CS | ML | DL

0개의 댓글