[Python] argparse 사용하기

Woong·2023년 8월 2일
0

Python / Machine Learning

목록 보기
6/20

명령행 옵션 인자에 대한 파서

parser.add_argument('filename')           # 위치 인자
parser.add_argument('-c', '--count')      # 옵션 인자

add_argument 인자 추가

  • nargs :
    • ?: 1개 인자만 사용. 없을 경우 default 사용. 옵션 사용은 하지만 인자가 없을 경우 const 사용
    • *: 모든 명령행 인자를 list 로 받기
    • +: * 과 유사하게 list로 받지만, 최소 1개 인자 필수
    • 숫자: N개의 인자 사용
>>parser = argparse.ArgumentParser()
>>parser.add_argument('--foo', nargs='?', const='c', default='d')

# 옵션 + 인자 
>>parser.parse_args(['--foo', 'YY'])
Namespace(foo='YY')

# 옵션은 있지만 인자가 없어 const 사용
>>parser.parse_args(['XX', '--foo'])
Namespace(foo='c')

# 옵션 없을 시 default 
>>parser.parse_args([])
Namespace(foo='d')
  • help : 인자에 대한 help message

  • required: 필수 여부 True/False

  • dest :

    • 지정하지 않을 경우 첫번째 옵션 문자열에서 -- 를 제거하여 지정
  • choice : 지정된 집합 안에서 선택. 범위를 벗어나면 에러 발생

    • list, tuple, range() 등을 활용
# list 를 통해 집합 지정
>>parser = argparse.ArgumentParser(prog='game.py')
>>parser.add_argument('move', choices=['rock', 'paper', 'scissors'])
>>parser.parse_args(['rock'])
Namespace(move='rock')
# 지정되지 않은 인자이므로 에러
>>parser.parse_args(['fire'])
usage: game.py [-h] {rock,paper,scissors}
game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',
'paper', 'scissors')

# range 로 숫자 범위 지정
>>parser = argparse.ArgumentParser(prog='doors.py')
>>parser.add_argument('door', type=int, choices=range(1, 4))
>>print(parser.parse_args(['3']))
Namespace(door=3)
# 범위를 벗어나 에러
>>parser.parse_args(['4'])
usage: doors.py [-h] {1,2,3}
doors.py: error: argument door: invalid choice: 4 (choose from 1, 2, 3)
  • type : 문자열이 아닌 타입으로 변환
    • int, float 등 타입 지정. 사용자 함수도 가능
    • bool 은 권장하지 않음. 빈 문자열인지 여부로 지정되므로 바람직하지 않음
import argparse
import pathlib

parser = argparse.ArgumentParser()
parser.add_argument('count', type=int)
parser.add_argument('distance', type=float)
parser.add_argument('street', type=ascii)
parser.add_argument('code_point', type=ord)
parser.add_argument('source_file', type=open)
parser.add_argument('dest_file', type=argparse.FileType('w', encoding='utf8'))
parser.add_argument('datapath', type=pathlib.Path)

ex)

parser.add_argument('--file', '-f', nargs='?', help='target file name', dest='file_name')
parser.add_argument('--date', '-d', nargs='?', help='yyyyMMdd', default=datetime.now().strftime("%Y%m%d"), dest='date')


# type=int 로 숫자로 받기, 
parser.add_argument('--number', '-n', nargs='?', type=int, help='something number', default=1, dest='number')

# 인자에 대한 help message 출력
parser.print_help()

reference

1개의 댓글

comment-user-thumbnail
2023년 8월 2일

개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.

답글 달기