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. 인자 그룹화
argparse
는 ArgumentParser
객체에 서브파서를 추가하여 명령어를 그룹화할 수 있습니다. 예를 들어, 명령어에 따라 서로 다른 동작을 수행하도록 설정할 수 있습니다.
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. 인자 상호 의존성
인자 간의 상호 의존성을 정의하려면 argparse
의 parse_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
옵션이 설정된 경우 추가적인 설명을 출력합니다.
참고문서
'Study Information Technology' 카테고리의 다른 글
Python의 codecs 모듈을 통한 국제화 지원 인코딩과 디코딩 (0) | 2024.08.18 |
---|---|
Python의 xml과 json 라이브러리 데이터 직렬화 및 교환 형식 (0) | 2024.08.18 |
Spring Boot와 Apache Kafka 통합하기 이벤트 기반 아키텍처 구축 (0) | 2024.08.17 |
Spring Boot에서 에러 처리하기 (0) | 2024.08.17 |
Spring Boot와 Apache ActiveMQ 통합하기 (1) | 2024.08.17 |