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

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

getopt 모듈은 스크립트가 sys.argv의 명령줄 인자를 파싱하도록 도와줘요. Unix getopt() 함수와 같은 관례를 지원해요(형태가 '-'와 '--'인 인자의 특별한 의미 포함). GNU 소프트웨어가 지원하는 것과 비슷한 long 옵션도 선택적 세 번째 인자를 통해 사용할 수 있습니다.

참고: 이 모듈은 기능이 완성된(feature complete) 것으로 간주돼요. 이 API에 대한 더 선언적이고 확장 가능한 대안은 optparse 모듈에서 제공합니다. 명령줄 매개변수 처리의 추가 기능 향상은 PyPI의 서드파티 모듈이나 argparse 모듈의 기능으로 제공됩니다.

Unix getopt() 함수에 익숙하지 않은 사용자는 argparse 모듈을 쓰는 걸 고려해 보세요. Unix getopt()는 알지만 더 적은 코드로 같은 동작을, 더 나은 도움말·오류 메시지를 원한다면 optparse 모듈을 고려해 보시길. (인자 파싱 라이브러리 선택에 대한 자세한 내용은 "Choosing an argument parsing library" 참고.)

이 모듈은 두 개의 함수와 하나의 예외를 제공해요:

출처: Python 표준 라이브러리

getopt()

  • getopt.getopt(args, shortopts, longopts=[])

명령줄 옵션과 매개변수 목록을 파싱해요. args는 파싱할 인자 목록으로, 실행 중인 프로그램에 대한 선두 참조는 빠져 있어요. 일반적으로 이는 sys.argv[1:]을 뜻합니다. shortopts는 스크립트가 인식하고 싶은 옵션 문자들의 문자열인데, 인자를 요구하는 옵션은 콜론(':')이 뒤따르고 선택적 인자를 받는 옵션은 콜론 두 개('::')가 뒤따릅니다. 즉 Unix getopt()가 쓰는 것과 같은 형식이에요.

참고: GNU getopt()와 달리, non-option 인자 뒤에 오는 모든 인자는 역시 non-option으로 간주됩니다. 이는 non-GNU Unix 시스템이 동작하는 방식과 비슷해요.

longopts는 지정되면, 지원해야 할 long 옵션 이름들의 문자열 리스트여야 합니다. 옵션 이름에 선두 '--' 문자는 포함되지 않아야 해요. 인자를 요구하는 long 옵션에는 등호('=')가 뒤따르고, 선택적 인자를 받는 long 옵션에는 등호와 물음표('=?')가 뒤따릅니다. long 옵션만 받으려면 shortopts는 빈 문자열이어야 해요. 명령줄의 long 옵션은, 수용된 옵션 중 정확히 하나와 일치하는 옵션 이름의 프리픽스를 제공하기만 하면 인식됩니다. 예를 들어 longopts['foo', 'frob']라면 옵션 --fo--foo로 일치하지만, --f는 유일하게 일치하지 않으므로 GetoptError가 발생해요.

longopts가 문자열이면 단일 요소 리스트로 취급됩니다.

반환 값은 두 요소로 이뤄져요: 첫 번째는 (option, value) 쌍들의 리스트, 두 번째는 옵션 목록이 제거된 뒤 남은 프로그램 인자들의 리스트입니다(이는 args의 끝부분 슬라이스예요). 반환되는 각 옵션-값 쌍은 첫 요소로 짧은 옵션이면 하이픈 하나(예: '-x'), long 옵션이면 하이픈 두 개(예: '--long-option')가 붙은 옵션을, 두 번째 요소로 옵션 인자를 가지며 인자가 없으면 빈 문자열을 가져요. 옵션들은 발견된 순서대로 리스트에 나타나므로 여러 번 나타나는 것도 허용됩니다. long과 short 옵션은 섞일 수 있어요.

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

gnu_getopt()

  • getopt.gnu_getopt(args, shortopts, longopts=[])

이 함수는 getopt()처럼 동작하지만, 기본적으로 GNU 스타일 스캔 모드를 사용해요. 즉 옵션 인자와 non-option 인자가 서로 섞일 수 있다는 뜻입니다. getopt() 함수는 non-option 인자를 만나면 즉시 옵션 처리를 멈춰요.

옵션 문자열의 첫 문자가 '+'이거나 환경 변수 POSIXLY_CORRECT가 설정돼 있으면, non-option 인자를 만나는 즉시 옵션 처리가 멈춥니다.

옵션 문자열의 첫 문자가 '-'이면, 옵션 뒤에 따라오는 non-option 인자들이 첫 요소로 None, 두 번째 요소로 그 non-option 인자들의 리스트를 가진 쌍으로 옵션-값 쌍 리스트에 추가돼요. gnu_getopt() 결과의 두 번째 요소는 마지막 옵션 뒤의 프로그램 인자들의 리스트입니다.

버전 3.14에서 변경: 섞인 옵션과 non-option 인자를 순서대로 반환하는 지원이 추가됐어요.

GetoptError

  • exception getopt.GetoptError

인자 목록에서 인식할 수 없는 옵션을 찾았거나, 인자를 요구하는 옵션에 인자가 주어지지 않았을 때 발생해요. 예외의 인자는 오류의 원인을 나타내는 문자열입니다. long 옵션의 경우, 인자를 요구하지 않는 옵션에 인자가 주어져도 이 예외가 발생해요. 속성 msgopt는 오류 메시지와 관련 옵션을 주며, 예외가 관련된 특정 옵션이 없으면 opt는 빈 문자열이에요.

error

  • exception getopt.error

GetoptError의 별칭; 하위 호환을 위해 제공됩니다.

예제

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

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

long 옵션 이름 사용도 그만큼 쉽습니다:

>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'
>>> args = s.split()
>>> args
['--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', '')]
>>> args
['a1', 'a2']

선택적 인자는 명시적으로 지정해야 해요:

>>> s = '-Con -C --color=off --color a1 a2'
>>> args = s.split()
>>> args
['-Con', '-C', '--color=off', '--color', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'C::', ['color=?'])
>>> optlist
[('-C', 'on'), ('-C', ''), ('--color', 'off'), ('--color', '')]
>>> args
['a1', 'a2']

옵션과 non-option 인자의 순서를 보존할 수 있어요:

>>> s = 'a1 -x a2 a3 a4 --long a5 a6'
>>> args = s.split()
>>> args
['a1', '-x', 'a2', 'a3', 'a4', '--long', 'a5', 'a6']
>>> optlist, args = getopt.gnu_getopt(args, '-x:', ['long='])
>>> optlist
[(None, ['a1']), ('-x', 'a2'), (None, ['a3', 'a4']), ('--long', 'a5')]
>>> args
['a6']

스크립트에서의 전형적인 사용법은 대략 이렇습니다:

import getopt, sys

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError as err:
        # print help information and exit:
        print(err)  # will print something like "option -a not recognized"
        usage()
        sys.exit(2)
    output = None
    verbose = False
    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
        else:
            assert False, "unhandled option"
    process(args, output=output, verbose=verbose)

if __name__ == "__main__":
    main()

동등한 명령줄 인터페이스는 optparse 모듈을 쓰면 더 적은 코드와 더 유익한 도움말·오류 메시지로 만들 수 있어요:

import optparse

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-o', '--output')
    parser.add_option('-v', dest='verbose', action='store_true')
    opts, args = parser.parse_args()
    process(args, output=opts.output, verbose=opts.verbose)

이 경우에 대략 동등한 명령줄 인터페이스는 argparse 모듈로도 만들 수 있습니다:

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--output')
    parser.add_argument('-v', dest='verbose', action='store_true')
    parser.add_argument('rest', nargs='*')
    args = parser.parse_args()
    process(args.rest, output=args.output, verbose=args.verbose)

(argparse 버전의 이 코드가 optparse(및 getopt) 버전과 동작이 어떻게 다른지는 "Choosing an argument parsing library"를 참고하세요.)

함께 보기: optparse 모듈 — 선언적 명령줄 옵션 파싱. argparse 모듈 — 더 정제된 명령줄 옵션·인자 파싱 라이브러리.

더 알아보기