파이썬 스크립트를 실행할 때 값을 바깥에서 넘기고 싶을 때가 있다. 값이 코드 안에 박혀 있으면 바꿀 때마다 파일을 열어야 한다. 표준 라이브러리의 argparse를 쓰면 python argparseTest.py -testArg=123처럼 실행 명령에 붙인 값을 스크립트 안에서 꺼내 쓸 수 있다.

인자를 하나만 등록한 최소 예제를 돌려 봤는데, 정작 눈에 들어온 건 따로 만들지 않은 --help였다. 이 글에서는 그 예제와 출력을 정리한다.

인자 하나를 받는 최소 예제

import argparse

# 인자값을 받을 수 있는 인스턴스 생성
parser = argparse.ArgumentParser(description='사용법 테스트입니다.')

# 입력받을 인자값 등록
parser.add_argument("-testArg", dest="testDest", help="python argparseTest.py -testArg={입력값} 형태로 입력하세요~")

# 입력받은 인자값을 args에 저장 (type: namespace)
args = parser.parse_args()

if args.testDest:
    print("결과값: ", args.testDest)

흐름은 세 줄이다. ArgumentParser로 파서를 만들고 add_argument로 받을 인자를 등록한 다음, parse_args()가 실제 명령줄을 읽는다.

dest는 읽은 값을 담을 속성 이름이다. 명령줄에서는 -testArg로 넘기지만 코드에서는 args.testDest로 꺼낸다. dest를 주지 않으면 옵션 이름에서 대시를 뗀 testArg가 속성 이름이 된다.

실행해 보기

값을 넘기면 그대로 찍힌다.

» python argparseTest.py -testArg=123
결과값:  123

-testArg=123 대신 -testArg 123처럼 띄어 써도 결과는 같다. 인자를 아예 주지 않으면 args.testDest가 None이라서 아무것도 출력하지 않고 끝난다.

만들지 않은 –help가 이미 있다

코드에는 -testArg 하나만 등록했는데 --help를 붙여 실행하면 사용법이 나온다.

» python argparseTest.py --help
usage: argparseTest.py [-h] [-testArg TESTDEST]

사용법 테스트입니다.

optional arguments:
  -h, --help         show this help message and exit
  -testArg TESTDEST  python argparseTest.py -testArg={입력값} 형태로 입력하세요~

-h/--help는 ArgumentParser가 기본으로 넣어 주는 옵션이다. 출력의 재료는 모두 코드에 적은 값이다. description은 설명 문단으로, 각 인자의 help는 옵션 옆 설명으로 들어간다. TESTDEST는 dest 값을 대문자로 바꾼 자리표시자다. 스크립트 사용법을 README에 따로 적지 않아도 실행하는 사람이 --help로 확인할 수 있다.

등록하지 않은 옵션을 넘기면 usage를 보여 주고 에러로 끝난다.

» python argparseTest.py -x
usage: argparseTest.py [-h] [-testArg TESTDEST]
argparseTest.py: error: unrecognized arguments: -x

참고

  • 위 --help 출력의 optional arguments:는 Python 3.9 이하의 표기다. 3.10부터는 같은 자리가 options:로 나온다. 버전이 달라 출력이 조금 다르게 보여도 동작은 같다.

  • -testArg처럼 대시 하나에 긴 이름을 붙여도 동작은 한다. 다만 관례는 긴 이름에 대시 두 개(--test-arg), 한 글자 약어에 대시 하나(-t)다. 이렇게 등록하면 dest를 안 줘도 속성 이름이 test_arg로 정해진다.

인자가 하나일 때는 sys.argv[1]로 바로 꺼내도 된다. 그래도 argparse를 쓰면 사용법 출력과 잘못된 인자 처리가 딸려 오니 남이 실행할 스크립트라면 처음부터 argparse로 시작하는 편이 낫겠다.