getopt — 명령줄 옵션을 위한 C 스타일 파서

getopt — 명령줄 옵션을 위한 C 스타일 파서

getopt 모듈은 스크립트가 sys.argv의 명령줄 인자를 파싱하는 데 도움을 줘요. Unix getopt() 함수와 동일한 규칙을 지원하며(--- 형태 인자의 특별한 의미 포함), 선택적 세 번째 인자를 통해 GNU 소프트웨어가 지원하는 것과 비슷한 긴 옵션도 사용할 수 있어요.

Unix getopt() 함수에 익숙하지 않은 사용자는 대신 argparse 모듈을 사용하는 것을 고려해야 해요. Unix getopt()에 익숙하지만 더 적은 코드로 동등한 동작을 원하고 더 나은 도움말·오류 메시지를 원한다면 optparse 모듈을 고려해요. 이 모듈은 기능이 완성된 것으로 간주되며, 더 선언적이고 확장 가능한 대안은 optparse 모듈이 제공해요.

출처: Python documentation

본문

함수와 예외

getopt.getopt(args, shortopts, longopts=[]) — 명령줄 옵션과 파라미터 리스트를 파싱해요. args는 실행 중인 프로그램에 대한 선행 참조가 없는, 파싱할 인자 리스트예요. 보통 sys.argv[1:]을 의미해요. shortopts는 스크립트가 인식하려는 옵션 문자들의 문자열이며, 인자를 요구하는 옵션 뒤에는 콜론(':'), 선택적 인자를 받는 옵션 뒤에는 콜론 두 개('::')를 붙여요. 즉 Unix getopt()와 같은 형식이에요.

GNU getopt()와 달리, 논옵션 인자 이후에는 모든 추가 인자가 논옵션으로 간주돼요. longopts는 지정한다면 지원할 긴 옵션 이름을 담은 문자열 리스트여야 해요. 선행 '--' 문자는 옵션 이름에 포함되지 않아야 해요. 인자를 요구하는 긴 옵션 뒤에는 등호('=')를, 선택적 인자를 받는 긴 옵션 뒤에는 등호와 물음표('=?')를 붙여요.

긴 옵션만 받으려면 shortopts는 빈 문자열이어야 해요. 명령줄의 긴 옵션은 수용된 옵션 중 정확히 하나와 일치하는 이름의 접두사를 제공하는 한 인식될 수 있어요. 예를 들어 longopts['foo', 'frob']라면 옵션 --fo--foo로 일치하지만, --f는 유일하게 일치하지 않으므로 GetoptError가 발생해요.

반환값은 두 요소로 구성돼요. 첫 번째는 (option, value) 쌍의 리스트이고, 두 번째는 옵션 리스트가 제거된 뒤 남은 프로그램 인자 리스트예요. 각 옵션-값 쌍은 첫 요소로 옵션(짧은 옵션은 하이픈 한 개, 예: '-x', 긴 옵션은 하이픈 두 개, 예: '--long-option'을 붙임), 두 번째 요소로 옵션 인자(옵션에 인자가 없으면 빈 문자열)를 가져요. 옵션은 발견된 순서대로 리스트에 나타나 여러 번 나올 수 있으며, 긴 옵션과 짧은 옵션을 섞을 수 있어요.

버전 3.14에서 변경: 선택적 인자가 지원돼요.

getopt.gnu_getopt(args, shortopts, longopts=[])getopt()와 비슷하게 동작하지만 기본적으로 GNU 스타일 스캔 모드를 사용해요. 즉 옵션과 논옵션 인자가 서로 섞일 수 있어요. 옵션 문자열의 첫 문자가 '+'이거나 환경 변수 POSIXLY_CORRECT가 설정되어 있으면 논옵션 인자가 등장하는 즉시 옵션 처리가 멈춰요. 옵션 문자열의 첫 문자가 '-'이면 옵션 뒤에 오는 논옵션 인자를 None을 첫 요소로, 논옵션 인자 리스트를 두 번째 요소로 하는 쌍으로 옵션-값 쌍 리스트에 추가해요.

exception getopt.GetoptError — 인자 리스트에서 인식할 수 없는 옵션을 찾았거나, 인자를 요구하는 옵션에 인자가 주어지지 않았을 때 발생해요. msgopt 속성이 오류 메시지와 관련 옵션을 주며, 특정 옵션이 없으면 opt는 빈 문자열이에요.

exception getopt.errorGetoptError의 별칭으로, 하위 호환을 위해 제공돼요.

예시

Unix 스타일 옵션만 사용하는 예시:

>>> import getopt
>>> args = '-a -b -cfoo -d bar a1 a2'.split()
>>> optlist, args = getopt.getopt(args, 'abc:d:')
>>> optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]
>>> args
['a1', 'a2']

긴 옵션 이름 사용도 쉽게 가능해요:

>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'
>>> optlist, args = getopt.getopt(args, 'x', [
...     'condition=', 'output-file=', 'testing'])
>>> optlist
[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]

스크립트에서의 일반적인 사용은 다음과 같아요:

import getopt, sys
def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError as err:
        print(err)
        usage()
        sys.exit(2)
    for o, a in opts:
        if o == "-v":
            verbose = True
        elif o in ("-h", "--help"):
            usage()
            sys.exit()
        elif o in ("-o", "--output"):
            output = a

참고

  • 모듈 optparse — 선언적 명령줄 옵션 파싱.
  • 모듈 argparse — 더 주관적인 명령줄 옵션·인자 파싱 라이브러리.

더 알아보기 (Learn more)