명령줄 인수란 무엇인가?
명령줄 인수(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 등의 매개변수를 조합하면 훨씬 더 강력하고 유연한 명령줄 인터페이스를 구성할 수 있습니다.