파이썬 스크립트를 명령줄에서 실행할 때 인수를 전달해야 하는 경우가 매우 흔합니다. 그런데 필요한 매개변수가 개수, 타입, 순서 면에서 맞지 않으면 스크립트는 예외를 발생시킵니다. 바로 이럴 때 명령줄 인수를 제대로 파싱(구문 분석)하는 기능이 필요합니다.
argparse 모듈이란?
파이썬의 argparse 모듈은 사용하기 쉬운 명령줄 인터페이스(CLI)를 작성할 수 있는 도구를 제공합니다. 이 모듈은 sys.argv 리스트에 담긴 인수를 어떻게 해석할지 처리하고, 도움말 메시지를 자동으로 생성하며, 잘못된 옵션이 입력되면 오류 메시지를 출력해 줍니다.
1단계: 파서 객체 생성하기
명령줄 인터페이스 설계의 첫 번째 단계는 파서 객체를 만드는 것입니다. 이는 argparse 모듈의 ArgumentParser() 함수로 수행하며, description 매개변수에 설명 문자열을 지정할 수 있습니다.
먼저 아무 인수 없이 실행되는 간단한 스크립트부터 살펴보겠습니다. 파서 객체의 parse_args() 메서드를 호출하지만, 전달된 인수가 없으므로 실제로는 아무 작업도 수행하지 않습니다.
import argparse parser = argparse.ArgumentParser(description="sample argument parser") args = parser.parse_args()
위 스크립트를 실행하면 다음과 같은 결과를 얻습니다.
C:\python36>python argparser1.py C:\python36>python argparser1.py --help usage: argparser1.py [-h] sample argument parser optional arguments: -h, --help show this help message and exit
두 번째 실행에서 --help 옵션을 사용하면 위와 같은 도움말 메시지가 출력됩니다. 참고로 --help 매개변수는 기본적으로 제공됩니다.
2단계: 필수 인수 정의하기
이제 스크립트 실행에 반드시 필요한 인수를 정의해 보겠습니다. 해당 인수가 주어지지 않으면 스크립트는 오류를 발생시켜야 합니다. 여기서는 add_argument() 메서드로 'user'라는 인수를 정의합니다.
import argparse
parser = argparse.ArgumentParser(description="sample argument parser")
parser.add_argument("user")
args = parser.parse_args()
if args.user == "Admin":
print("Hello Admin")
else:
print("Hello Guest")이제 스크립트의 도움말에는 'user'라는 위치 인수(positional argument)가 표시됩니다. 프로그램은 값이 'Admin'인지 확인하고 그에 맞는 메시지를 출력합니다.
C:\python36>python argparser1.py --help usage: argparser1.py [-h] user sample argument parser positional arguments: user optional arguments: -h, --help show this help message and exit C:\python36>python argparser1.py Admin Hello Admin C:\python36>python argparser1.py temp Hello Guest
3단계: 기본값 설정하기
add_argument() 메서드에서 default 매개변수를 사용하면 인수에 기본값을 지정할 수 있습니다.
import argparse
parser = argparse.ArgumentParser(description="sample argument parser")
parser.add_argument("user", nargs='?', default="Admin")
args = parser.parse_args()
if args.user == "Admin":
print("Hello Admin")
else:
print("Hello Guest")여기서 nargs는 소비해야 할 명령줄 인수의 개수를 의미합니다. '?'로 지정하면 가능한 경우 명령줄에서 하나의 인수를 소비하여 단일 항목으로 반환하고, 명령줄 인수가 없으면 default 값이 사용됩니다.
C:\python36>python argparser1.py Hello Admin C:\python36>python argparser1.py Admin Hello Admin C:\python36>python argparser1.py test Hello Guest
4단계: 인수 타입 지정하기
기본적으로 모든 인수는 문자열로 취급됩니다. 인수의 타입(type)을 명시적으로 지정하려면 add_argument() 메서드의 type 매개변수를 사용하세요. 파이썬의 모든 데이터 타입이 type 값으로 유효합니다.
import argparse
parser = argparse.ArgumentParser(description="add numbers")
parser.add_argument("first", type=int)
parser.add_argument("second", type=int)
args = parser.parse_args()
x = args.first
y = args.second
z = x + y
print('addition of {} and {} = {}'.format(x, y, z))C:\python36>python argparser2.py 2 3 addition of 2 and 3 = 5
5단계: 선택적 인수 추가하기
앞선 예제의 인수들은 모두 필수였습니다. 선택적(optional) 인수를 추가하려면 인수 이름 앞에 이중 대시 --를 붙입니다. 다음 예제에서 surname 인수는 --surname처럼 이중 대시가 붙어 있으므로 선택적입니다.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
parser.add_argument("--surname")
args = parser.parse_args()
print("My name is ", args.name, end=' ')
if args.surname:
print(args.surname)한 글자 이름 앞에 단일 대시를 붙이면 짧은 이름(short name) 옵션으로 동작합니다.
C:\python36>python argparser3.py Malhar My name is Malhar C:\python36>python argparser3.py Malhar --surname Lathkar My name is Malhar Lathkar
parser.add_argument("-s", "--surname")6단계: 허용 값 목록(choices) 지정하기
특정 인수가 미리 정의된 목록의 값만 가지도록 하고 싶다면 choices 매개변수를 사용합니다.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("sub", choices=['Physics', 'Maths', 'Biology'])
args = parser.parse_args()
print("My subject is ", args.sub)매개변수 값이 목록에 없으면 invalid choice 오류가 표시됩니다.
C:\python36>python argparser4.py Physics
My subject is Physics
C:\python36>python argparser4.py English
usage: argparser4.py [-h] {Physics,Maths,Biology}
argparser4.py: error: argument sub: invalid choice: 'English' (choose from 'Physics', 'Maths', 'Biology')마무리
argparse 모듈을 활용하면 필수·선택적 인수 정의, 기본값과 타입 지정, 허용 값 제한까지 손쉽게 구현할 수 있습니다. 자동 도움말 생성과 오류 검증 기능 덕분에 명령줄 도구를 더 견고하고 사용자 친화적으로 만들 수 있으니, 스크립트 작성 시 적극적으로 활용해 보시기 바랍니다.