프로그래밍/Python

[python] 명령줄 인자 분석 - argparse.ArgumentParser

채윤아빠 2024. 6. 20. 09:20
728x90
반응형

파이썬에서 명령줄 파라미터를 처리하는 방법을 알아겠습니다.

일반적으로 가장 많이 사용되는 것은 파이썬에 내장된 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를 이용하면 손쉽게 처리할 수 있습니다.


참고자료