파이썬에서 명령줄 파라미터를 처리하는 방법을 알아겠습니다.
일반적으로 가장 많이 사용되는 것은 파이썬에 내장된 argparse 모듈입니다. 본 글에서는 argparse 모듈의 ArgumentParser 클래스를 이용하는 방법에 대하여 알아 보도록 하겠습니다.
명령줄 인자(Command-Line Arguments)란?
프로그램을 실행할 때 프로그램에 전달하는 추가 정보입니다.
다음과 같은 형식으로 프로그램 실행 시, 추가적인 정보를 전달합니다.
$ my_app hello world 123
위에서는 "hello" "world" "123" 등 3개의 정보를 추가로 전달하여 "my_app"을 실행하게 됩니다.
파이썬에서는 sys.argv로 위와 같이 전달된 명령줄 인자를 받아서 처리할 수 있습니다.
import sys
print("프로그램 이름:", sys.argv[0]) # 첫 번째 인자(argv[0])는 항상 프로그램의 이름입니다.
print("전달된 인자들:", sys.argv[1:]) # 실제 인자는 argv[1]부터 시작됩니다.
print("인자 개수:", len(sys.argv))
위와 같은 명령줄 인자를 이용하면 다음과 같은 장점이 있습니다.
- 프로그램의 동작을 실행 시점에 제어할 수 있음
- 배치 처리나 자동화에 용이
- 다른 프로그램과의 연동이 쉬움
- 설정 파일 없이 프로그램 동작을 변경할 수 있음
다음과 같이 "ls" 명령처럼 복잡한 옵션을 처리할 수도 있습니다.
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all do not ignore entries starting with .
-A, --almost-all do not list implied . and ..
--author with -l, print the author of each file
-b, --escape print C-style escapes for nongraphic characters
--block-size=SIZE with -l, scale sizes by SIZE when printing them;
e.g., '--block-size=M'; see SIZE format below
-B, --ignore-backups do not list implied entries ending with ~
-c with -lt: sort by, and show, ctime (time of last
change of file status information);
with -l: show ctime and sort by name;
otherwise: sort by ctime, newest first
.
.
.
argparse.ArgumentParser
위 "ls" 명령과 같이 복잡한 부가 정보의 처리를 sys.argv를 이용하여 직접하려면 매우 번거롭습니다.
복잡한 옵션을 처리하기 위하여 argparse.ArgumentParser를 이용합니다.
argparse.ArgumentParser를 이용하면 다음과 같은 장점이 있습니다.
- 자동 도움말 생성
- 인자 타입 검증
- 기본값 설정
- 필수/선택 인자 구분
- 다양한 인자 형식 지원
argparse.ArgumentParser를 이용한 간단한 예제입니다.
import argparse
import sys
def parse_arguments():
""" 명령줄 인자를 파싱하는 함수 """
# ArgumentParser 인스턴스 생성
parser = argparse.ArgumentParser(
description = '파일 처리 프로그램 예제',
formatter_class = argparse.RawDescriptionHelpFormatter
)
# 필수 인자
parser.add_argument('input_file',
help='처리할 입력 파일 경로')
# 선택적 인자 (옵션)
parser.add_argument('-o', '--output',
help='출력 파일 경로 (기본값: output.txt)',
default='output.txt')
# 불리언 플래그
parser.add_argument('-v', '--verbose',
action='store_true',
help='상세 출력 모드 활성화')
# 숫자 인자
parser.add_argument('-n', '--number',
type=int,
default=1,
help='처리할 횟수 (기본값: 1)')
# 선택 인자
parser.add_argument('-m', '--mode',
choices=['read', 'write', 'append'],
default='read',
help='파일 처리 모드 선택 (기본값: read)')
# 여러 값을 받는 인자
parser.add_argument('-f', '--filters',
nargs='+',
help='적용할 필터 목록')
try:
args = parser.parse_args()
return args
except Exception as e:
parser.print_help()
sys.exit(1)
def main():
# 인자 파싱
args = parse_arguments()
# 파싱된 인자 사용 예시
if args.verbose:
print(f"입력 파일: {args.input_file}")
print(f"출력 파일: {args.output}")
print(f"처리 모드: {args.mode}")
print(f"처리 횟수: {args.number}")
print(f"필터 목록: {args.filters}")
# 여기에 실제 파일 처리 로직 구현
try:
with open(args.input_file, 'r') as f:
content = f.read()
# 처리 로직...
if args.verbose:
print("파일 처리 완료")
except FileNotFoundError:
print(f"오류: 입력 파일 '{args.input_file}'을 찾을 수 없습니다.")
sys.exit(1)
if (__name__ == "__main__"):
main()
필수 인자: input_file: 처리할 파일 경로
선택적 인자:
- -o 또는 --output: 출력 파일 경로
- -v 또는 --verbose: 상세 출력 모드
- -n 또는 --number: 처리 횟수
- -m 또는 --mode: 처리 모드
- -f 또는 --filters: 필터 목록
별도로 코딩을 하지 않았지만, 선택적 옵션에 자동으로 "-h" 또는 "--help" 옵션이 지원됩니다.
위 예제를 "-h" 옵션을 주고 실행하면 다음과 같은 도움말이 출력됩니다.
usage: argparse_example1.py [-h] [-o OUTPUT] [-v] [-n NUMBER] [-m {read,write,append}] [-f FILTERS [FILTERS ...]] input_file
파일 처리 프로그램 예제
positional arguments:
input_file 처리할 입력 파일 경로
options:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
출력 파일 경로 (기본값: output.txt)
-v, --verbose 상세 출력 모드 활성화
-n NUMBER, --number NUMBER
처리할 횟수 (기본값: 1)
-m {read,write,append}, --mode {read,write,append}
파일 처리 모드 선택 (기본값: read)
-f FILTERS [FILTERS ...], --filters FILTERS [FILTERS ...]
적용할 필터 목록
결언
간단한 명령줄 인자의 경우에는 sys.argv 만으로도 충분하지만, 복잡한 옵션을 처리할 경우에는 argparse.ArgumentParser를 이용하면 손쉽게 처리할 수 있습니다.
참고자료
- "argparse — Parser for command-line options, arguments and subcommands":https://docs.python.org/ko/3/library/argparse.html
'프로그래밍 > Python' 카테고리의 다른 글
[python] dict 객체 복사의 세 가지 방법 : 참조 복사, 얕은 복사, 깊은 복사 (0) | 2024.06.26 |
---|---|
[python] struct.error: char format requires a bytes object of length 1 (0) | 2024.06.22 |
[python] TypeError: argument 'data': 'memoryview' object cannot be converted to 'PyBytes' (0) | 2024.06.19 |
[python] LM73 TI 온도센서에서 온도값 읽어오기 (0) | 2024.06.10 |
[opencv] 종횡비 고정하여 이미지 크기 조정하기 (0) | 2024.06.01 |