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 옵션의 경우, 인자를 요구하지 않는 옵션에 인자가 주어져도 이 예외가 발생해요. 속성 msg와 opt는 오류 메시지와 관련 옵션을 주며, 예외가 관련된 특정 옵션이 없으면 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모듈 — 더 정제된 명령줄 옵션·인자 파싱 라이브러리.
더 알아보기
- Python 표준 라이브러리의
optparse,argparse모듈 - Python 공식 문서: getopt