sys.argv로 명령줄 인수 다루기
Python의 sys 모듈은 sys.argv를 통해 명령줄 인수에 접근할 수 있는 방법을 제공합니다. sys.argv는 명령줄 인수들이 담긴 리스트이며, sys.argv[0]는 프로그램 자체, 즉 스크립트 이름을 가리킵니다.
다음 코드를 args.py라는 이름으로 저장해 보세요.
import sys
print ('argument list', sys.argv)그리고 명령줄에서 위 스크립트를 다음과 같이 실행합니다.
C:\python37>python args.py 11 22 argument list ['args.py', '11', '22']
C 스타일 파서: getopt 모듈
getopt 모듈은 sys.argv에 담긴 명령줄 인수를 손쉽게 파싱할 수 있는 함수를 제공합니다. 이 모듈은 Unix의 getopt() 함수와 동일한 규칙을 따르며('-'와 '--' 형태 인수의 특별한 의미 포함), C 언어의 getopt() 함수에 익숙한 개발자라면 누구나 어려움 없이 사용할 수 있도록 API가 설계되어 있습니다.
getopt() 함수 문법
getopt(args, shortopts, longopts=[])
getopt() 함수는 명령줄 옵션과 매개변수 목록을 파싱합니다. 첫 번째 인수인 args는 실행 중인 프로그램 이름을 가리키는 sys.argv[0]를 제외한 인수 목록으로, 일반적으로 sys.argv[1:]를 전달합니다.
주요 매개변수
- shortopts: 스크립트가 인식할 짧은(short) 옵션 문자들을 담은 문자열입니다. 인수를 필요로 하는 옵션 뒤에는 콜론(':')을 붙이며, Unix
getopt()와 동일한 형식을 사용합니다. - longopts: 지정할 경우, 지원할 긴(long) 옵션 이름들의 문자열 리스트여야 합니다. 옵션 이름 앞의 '--' 문자는 포함하지 않으며, 인수를 필요로 하는 긴 옵션 뒤에는 등호('=')를 붙입니다.
반환 값과 예외 처리
반환 값은 두 요소로 구성됩니다. 첫 번째는 (옵션, 값) 쌍의 리스트이고, 두 번째는 옵션 목록을 제거한 후 남은 프로그램 인수들(args의 뒷부분 조각)입니다. 반환되는 각 옵션-값 쌍에서 옵션은 첫 번째 요소로, 짧은 옵션은 하이픈 하나(예: '-x'), 긴 옵션은 하이픈 두 개(예: '--long-option')가 접두사로 붙습니다. 두 번째 요소는 해당 옵션의 인수이며, 옵션에 인수가 없으면 빈 문자열이 됩니다. 옵션들은 발견된 순서대로 리스트에 담기므로 동일한 옵션이 여러 번 나타나는 것도 허용되며, 긴 옵션과 짧은 옵션을 섞어서 사용할 수도 있습니다.
인수 목록에서 인식되지 않는 옵션이 발견되거나, 인수가 필요한 옵션에 인수가 주어지지 않으면 GetoptError 예외가 발생합니다.
실전 예제
import sys, getopt
args = sys.argv[1:]
inputfile = ''
outputfile = ''
try:
opts, args = getopt.getopt(args, "hi:o:", ["ifile=", "ofile="])
except getopt.GetoptError:
print('args.py -i <inputfile> -o <outputfile>')
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print('args.py -i <inputfile> -o <outputfile>')
sys.exit()
elif opt in ("-i", "--ifile"):
inputfile = arg
elif opt in ("-o", "--ofile"):
outputfile = arg
print('Input file is:', inputfile)
print('Output file is:', outputfile)실행 결과
C:\python37>python args.py -h args.py -i <inputfile> -o <outputfile> C:\python37>python args.py -i abc.txt -o xyz.txt Input file is: abc.txt Output file is: xyz.txt C:\python37>python args.py --ifile=abc.txt --ofile=xyz.txt Input file is: abc.txt Output file is: xyz.txt
마치며
위 예제에서 볼 수 있듯이, getopt 모듈을 활용하면 짧은 옵션(-i, -o)과 긴 옵션(--ifile, --ofile)을 모두 지원하는 명령줄 인터페이스를 간단하게 구현할 수 있습니다. 다만 공식 문서에서는 더 강력하고 유연한 기능(자동 도움말 생성, 타입 검증 등)을 제공하는 argparse 모듈을 새 프로젝트에서 사용할 것을 권장하므로, 상황에 맞게 선택하는 것이 좋습니다.