모든 프로그래밍 언어에는 터미널에서 직접 실행하거나 다른 프로그램에서 호출할 수 있는 스크립트를 작성하는 기능이 있습니다. 이러한 스크립트를 실행할 때는 내부의 다양한 함수가 동작하는 데 필요한 인수(argument)를 함께 전달해야 하는 경우가 많습니다. 이 글에서는 Python 스크립트에 인수를 전달하는 대표적인 세 가지 방법을 예제와 함께 살펴보겠습니다.
1. sys.argv 사용하기
내장 모듈인 sys.argv는 스크립트와 함께 전달된 인수를 처리할 수 있는 가장 기본적인 방법입니다. 기본적으로 첫 번째 요소인 sys.argv[0]은 파일 이름이며, 나머지 인수들은 1, 2 순으로 인덱싱됩니다. 아래 예제는 스크립트가 전달받은 인수를 어떻게 활용하는지 보여줍니다.
import sys
print(sys.argv[0])
print("Hello ",sys.argv[1],", welcome!")위 코드를 실행하려면 터미널 창에 아래 명령어를 입력합니다. 여기서 스크립트 이름은 args_demo.py이며, 값이 Samantha인 인수를 하나 전달합니다.
D:\Pythons\py3projects>python3 args_demo.py Samantha args_demo.py Hello Samantha welcome!
이처럼 sys.argv는 간단하지만, 인수 개수나 형식에 대한 검증 기능이 없어 복잡한 입력 처리에는 한계가 있습니다.
2. getopt 사용하기
getopt는 앞선 방법보다 유연성이 뛰어난 접근 방식입니다. 옵션 형태의 인수 값을 수집하면서 오류 처리와 예외 처리까지 함께 수행할 수 있습니다. 아래 프로그램은 두 숫자를 인수로 받아 곱을 계산하되, 파일 이름에 해당하는 첫 번째 인수는 건너뜁니다. 당연히 여기서도 sys 모듈이 함께 사용됩니다.
예제
import getopt
import sys
# 파일 이름에 해당하는 첫 번째 인수 제거
all_args = sys.argv[1:]
prod = 1
try:
# 인수 수집
opts, arg = getopt.getopt(all_args, 'x:y:')
# 정확히 두 개의 옵션이 있어야 함
if len(opts) != 2:
print ('usage: args_demo.py -x <first_value> -b <second_value>')
else:
# 옵션과 값을 순회하며 곱 계산
for opt, arg_val in opts:
prod *= int(arg_val)
print('Product of the two numbers is {}'.format(prod))
except getopt.GetoptError:
print ('usage: args_demo.py -a <first_value> -b <second_value>')
sys.exit(2)출력 결과
위 코드를 실행하면 다음과 같은 결과를 얻습니다.
D:\Pythons\py3projects >python3 args_demo.py -x 3 -y 12 Product of the two numbers is 36 # Next Run D:\Pythons\py3projects >python3 args_demo.py usage: args_demo.py -x <first_value> -b <second_value>
옵션이 누락되거나 잘못된 형식으로 전달되면 GetoptError 예외가 발생하고, 사용법 안내 메시지를 출력한 후 프로그램이 종료됩니다.
3. argparse 사용하기
argparse는 인수 전달을 처리하는 데 가장 널리 권장되는 모듈입니다. 오류와 예외를 모듈 자체에서 자동으로 처리하기 때문에 추가 코드를 작성할 필요가 없습니다. 사용할 모든 인수에 대해 이름과 도움말(help) 텍스트를 지정한 후, 코드의 다른 부분에서 해당 인수 이름을 참조하면 됩니다.
예제
import argparse
# 인수 파서 생성
all_args = argparse.ArgumentParser()
# 파서에 인수 추가
all_args.add_argument("-x", "--Value1", required=True,
help="first Value")
all_args.add_argument("-y", "--Value2", required=True,
help="second Value")
args = vars(all_args.parse_args())
# 두 값의 곱 계산
print("Product is {}".format(int(args['Value1']) * int(args['Value2'])))출력 결과
위 코드를 실행하면 다음과 같은 결과를 얻습니다.
D:\Pythons\py3projects>python3 args_demo.py -x 3 -y 21 Product is 63 # Next Run D:\Pythons\py3projects>python3 args_demo.py -x 3 -y usage: args_demo.py [-h] -x VALUE1 -y VALUE2 args_demo.py: error: argument -y/--Value2: expected one argument
필수 인수(required=True)가 누락되면 argparse가 자동으로 사용법과 오류 메시지를 출력해 주므로, 개발자가 일일이 검증 로직을 작성할 필요가 없습니다.
마무리: 어떤 방법을 선택해야 할까?
세 가지 방법을 요약하면 다음과 같습니다.
- sys.argv: 설정 없이 바로 사용 가능하며, 간단한 스크립트에 적합합니다.
- getopt: 유닉스 스타일의 옵션(-x, --option) 처리가 필요할 때 유용합니다.
- argparse: 도움말 자동 생성, 필수 인수 검증, 타입 변환 등 강력한 기능을 제공하므로 대부분의 상황에서 최선의 선택입니다.
실무에서는 유지보수성과 사용자 편의성을 고려해 argparse를 사용하는 것이 가장 권장됩니다.