Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 명령줄 인수 완벽 가이드: sys.argv, getopt, argparse 활용법

명령줄 인수란 무엇인가?

명령줄 인수(Command Line Arguments)는 사용자가 프로그램이 특정 방식으로 동작하도록 지시할 수 있게 해주는 입력 매개변수입니다. 예를 들어 추가 정보를 출력하거나, 지정된 소스에서 데이터를 읽어오거나, 원하는 형식으로 데이터를 해석하는 등의 작업에 활용됩니다.

Python에서 명령줄 인수를 읽는 방법

Python은 명령줄 인수를 읽을 수 있는 다양한 방법을 제공합니다. 가장 널리 사용되는 방법은 다음과 같습니다.

  • Python sys.argv
  • Python getopt 모듈
  • Python argparse 모듈

sys 모듈로 명령줄 인수 읽기

sys 모듈은 명령줄 인수(CLA)를 리스트(list) 형태로 저장하며, sys.argv를 통해 이를 가져올 수 있습니다. 문자열 형태로 명령줄 인수를 읽는 가장 간단한 방법입니다.

import sys

print(type(sys.argv))
print('명령줄 인수 목록:')
for i in sys.argv:
    print(i)

위 프로그램을 실행하면 출력 결과는 다음과 같습니다.

실행 결과

>python CommandLineOption.py H E L L O
<class 'list'>
명령줄 인수 목록:
CommandLineOption.py
H
E
L
L
O

출력 결과에서 알 수 있듯이, sys.argv의 첫 번째 요소는 항상 실행 중인 스크립트 파일 이름이며, 그 뒤의 요소들이 명령줄에서 전달된 실제 인수들입니다.

getopt 모듈 활용하기

Python getopt 모듈은 sys.argv와 같은 인수 시퀀스를 파싱하여, 옵션과 인수 쌍으로 이루어진 시퀀스와 옵션이 아닌 인수들의 시퀀스를 반환합니다.

문법

getopt.getopt(args, options, [long_options])

각 매개변수의 의미는 다음과 같습니다.

  • args – 파싱할 인수 리스트입니다.

  • options – 스크립트가 인식할 옵션 문자들을 담은 문자열입니다.

  • long_options – 선택적 매개변수로, 지원해야 할 긴 형식(long) 옵션 이름들의 리스트입니다.

getopt 모듈에서 지원하는 옵션 문법은 다음과 같습니다.

  • -a
  • -bval
  • -b val
  • --noarg
  • --witharg=val
  • --witharg val

짧은 형식(Short form) 옵션 예제

아래 프로그램은 두 개의 옵션 -a와 -b를 받으며, 두 번째 옵션은 인수를 필요로 합니다.

import getopt
print(getopt.getopt(['-a', '-bval', '-c', 'val'], 'ab:c:'))

결과

[('-a', ''), ('-b', 'val'), ('-c', 'val')], [])

옵션 문자 뒤에 콜론(:)이 붙으면 해당 옵션이 인수를 요구한다는 의미입니다. 위 예제에서 'ab:c:'는 -a는 인수가 없고, -b와 -c는 인수가 필요함을 나타냅니다.

긴 형식(Long form) 옵션 예제

아래 프로그램은 --noarg와 --witharg 두 개의 옵션을 받으며, long_options 시퀀스는 ['noarg', 'witharg='] 형태여야 합니다.

import getopt
print(getopt.getopt(['--noarg', '--witharg', 'val', '--witharg2=another'], '', ['noarg', 'witharg=', 'witharg2=']))

결과

[('--noarg', ''), ('--witharg', 'val'), ('--witharg2',
'another')], [])

긴 형식 옵션에서 이름 뒤에 등호(=)가 붙으면 해당 옵션이 인수를 요구함을 의미합니다.

실전 예제

다음은 getopt 모듈의 실제 사용법을 보여주는 또 다른 예제입니다.

import getopt
import sys

argv = sys.argv[1:]
try:
    opts, args = getopt.getopt(argv, 'hm:d', ['help', 'my_file='])
    print(opts)
    print(args)
except getopt.GetoptError:
    print('오류가 발생했습니다!')
    sys.exit(2)

결과

>python CommandLineOption.py -m 2 -h "Help" H E L L O
[('-m', '2'), ('-h', '')]
['Help', 'H', 'E', 'L', 'L', 'O']

위 예제에서 sys.argv[1:]을 사용한 이유는 첫 번째 요소인 스크립트 파일 이름을 제외하고 실제 인수만 파싱하기 위함입니다. 또한 try-except 블록을 통해 잘못된 옵션이 전달되었을 때의 오류 처리까지 함께 수행합니다.

argparse 모듈 – 가장 권장되는 방법

Python argparse 모듈은 명령줄 인수를 파싱하는 공식적으로 권장되는 방법입니다. 이 모듈은 위치 인수(positional arguments), 인수 기본값 설정, 도움말 메시지 자동 생성, 인수 데이터 타입 지정 등 다양한 편리한 기능을 제공합니다.

다음은 argparse 모듈의 기본적인 사용법을 보여주는 간단한 프로그램입니다.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("string", help="입력받은 단어를 대문자로 출력합니다")
args = parser.parse_args()

print(args.string.upper()) # 이렇게 인수를 조작할 수 있습니다.

실행 결과

>python CommandLineOption.py "Hello, pythoN"
HELLO, PYTHON

또한 argparse 모듈을 사용하면 --verbosity처럼 선택적(optional) 인수도 손쉽게 설정할 수 있습니다. add_argument() 메서드에 '--verbosity'와 같은 옵션 문자열을 지정하면 되며, type, default, action 등의 매개변수를 조합하면 훨씬 더 강력하고 유연한 명령줄 인터페이스를 구성할 수 있습니다.