본문 바로가기

Study Information Technology

Python의 argparse를 활용한 커맨드라인 인자 파싱

728x90
반응형

Python의 argparse를 활용한 커맨드라인 인자 파싱

Overview

argparse는 Python 표준 라이브러리의 모듈로, 명령어 인자(command-line arguments)를 파싱하여 스크립트와 사용자 간의 상호작용을 지원합니다. 이 모듈은 특히 스크립트가 다양한 옵션을 받을 때 유용하며, 명령어 인자에 대한 유효성 검사를 자동으로 처리하고, 사용자에게 도움말을 제공하는 기능도 포함되어 있습니다. 이번 설명에서는 argparse의 기본 사용법부터 고급 기능까지 자세히 다뤄보겠습니다.


1. argparse 모듈 기본 사용법

1.1. 기본 설정 및 인자 정의

argparse를 사용하려면 먼저 모듈을 임포트하고, ArgumentParser 객체를 생성합니다. 이후 add_argument 메서드를 통해 인자를 정의합니다. 예를 들어, 사용자로부터 이름과 나이를 입력받는 스크립트를 작성해 보겠습니다.

import argparse

def main():
parser = argparse.ArgumentParser(description='사용자 정보를 입력받는 스크립트')
parser.add_argument('name', type=str, help='사용자의 이름')
parser.add_argument('age', type=int, help='사용자의 나이')

args = parser.parse_args()
print(f'이름: {args.name}, 나이: {args.age}')

if __name__ == '__main__':
main()

이 스크립트를 실행할 때는 다음과 같이 인자를 전달합니다:

python script.py Alice 30

이 명령어는 이름: Alice, 나이: 30을 출력합니다.

1.2. 인자 선택적 지정

argparse는 선택적인 인자를 지원합니다. 이를 통해 인자의 존재 여부에 따라 다르게 처리할 수 있습니다. --로 시작하는 인자는 선택적 인자입니다.

import argparse

def main():
parser = argparse.ArgumentParser(description='사용자 정보를 입력받는 스크립트')
parser.add_argument('--city', type=str, help='사용자의 도시')

args = parser.parse_args()
if args.city:
print(f'도시: {args.city}')
else:
print('도시 정보가 제공되지 않았습니다.')

if __name__ == '__main__':
main()

이 스크립트를 실행할 때는 선택적으로 --city 인자를 추가할 수 있습니다:

python script.py --city Seoul

이 명령어는 도시: Seoul을 출력합니다.


2. 인자의 데이터 타입 및 기본값 설정

2.1. 데이터 타입 지정

argparse는 인자의 데이터 타입을 명시할 수 있어 입력된 값이 예상한 형식과 일치하지 않을 경우 자동으로 오류를 발생시킵니다.

import argparse

def main():
parser = argparse.ArgumentParser(description='숫자를 제곱하는 스크립트')
parser.add_argument('number', type=int, help='제곱할 숫자')

args = parser.parse_args()
print(f'숫자 {args.number}의 제곱: {args.number ** 2}')

if __name__ == '__main__':
main()

이 스크립트는 정수형 인자만을 받으며, 만약 문자열이나 부동 소수점을 입력하면 에러가 발생합니다.

2.2. 기본값 설정

add_argument 메서드의 default 인자를 사용하면 인자가 제공되지 않을 때 사용할 기본값을 설정할 수 있습니다.

import argparse

def main():
parser = argparse.ArgumentParser(description='사용자 정보를 입력받는 스크립트')
parser.add_argument('--greeting', type=str, default='Hello', help='인사말')

args = parser.parse_args()
print(f'{args.greeting}, 사용자님!')

if __name__ == '__main__':
main()

이 스크립트를 실행할 때 --greeting 인자를 제공하지 않으면 기본값인 Hello가 사용됩니다.


3. 인자 그룹화 및 상호 의존성 처리

3.1. 인자 그룹화

argparseArgumentParser 객체에 서브파서를 추가하여 명령어를 그룹화할 수 있습니다. 예를 들어, 명령어에 따라 서로 다른 동작을 수행하도록 설정할 수 있습니다.

import argparse

def main():
parser = argparse.ArgumentParser(description='서브커맨드 예제')
subparsers = parser.add_subparsers(dest='command')

parser_foo = subparsers.add_parser('foo', help='foo 명령어')
parser_foo.add_argument('foo_arg', type=str, help='foo 인자')

parser_bar = subparsers.add_parser('bar', help='bar 명령어')
parser_bar.add_argument('bar_arg', type=int, help='bar 인자')

args = parser.parse_args()
if args.command == 'foo':
print(f'foo 명령어의 인자: {args.foo_arg}')
elif args.command == 'bar':
print(f'bar 명령어의 인자: {args.bar_arg}')

if __name__ == '__main__':
main()

이 스크립트를 실행할 때는 명령어를 선택할 수 있습니다:

python script.py foo example

이 명령어는 foo 명령어의 인자: example을 출력합니다.

3.2. 인자 상호 의존성

인자 간의 상호 의존성을 정의하려면 argparseparse_args 후 처리 로직을 활용합니다. 예를 들어, 특정 인자가 제공될 때 다른 인자도 필요하도록 설정할 수 있습니다.

import argparse
import sys

def main():
parser = argparse.ArgumentParser(description='인자 상호 의존성 예제')
parser.add_argument('--flag', action='store_true', help='플래그 인자')
parser.add_argument('--value', type=int, help='값 인자')

args = parser.parse_args()

if args.flag and args.value is None:
print('오류: --flag가 설정되었으면 --value도 설정해야 합니다.')
sys.exit(1)

if args.flag:
print(f'플래그가 설정되었습니다. 값: {args.value}')

if __name__ == '__main__':
main()

이 스크립트를 실행할 때 --flag를 설정하고 --value를 생략하면 오류 메시지가 출력됩니다.


4. 사용자 정의 에러 처리 및 도움말 메시지

4.1. 에러 처리

argparse는 기본적인 에러 메시지를 자동으로 제공하지만, 사용자 정의 에러 메시지를 추가하여 명확한 안내를 제공할 수 있습니다.

import argparse
import sys

def main():
parser = argparse.ArgumentParser(description='사용자 정의 에러 처리 예제')
parser.add_argument('number', type=int, help='정수 입력')

args = parser.parse_args()

if args.number <= 0:
print('오류: 입력된 숫자는 1 이상의 정수여야 합니다.')
sys.exit(1)

print(f'입력된 숫자: {args.number}')

if __name__ == '__main__':
main()

이 스크립트는 입력된 숫자가 1 이하일 때 사용자 정의 에러 메시지를 출력합니다.

4.2. 도움말 메시지

argparse는 자동으로 도움말 메시지를 생성합니다. description, help 인자를 활용하여 더 명확한 설명을 제공할 수 있습니다.

import argparse

def main():
parser = argparse.ArgumentParser(description='도움말 메시지 설정 예제')
parser.add_argument('--verbose', action='store_true', help='자세한 출력을 요청합니다.')
parser.add_argument('input', type=str, help='입력 파일 이름')

args = parser.parse_args()
if args.verbose:
print(f'자세한 출력을 요청하셨습니다. 입력 파일: {args.input}')
else:
print(f'입력 파일: {args.input}')

if __name__ == '__main__':
main()

이 스크립트는 --verbose 옵션이 설정된 경우 추가적인 설명을 출력합니다.


참고문서

728x90
반응형