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

Python에서 명령줄 인수를 추가하는 방법 완벽 가이드


소개

Python에는 명령줄 인수를 손쉽게 파싱할 수 있는 강력한 argparse 모듈이 기본으로 내장되어 있습니다. 운영체제 명령줄에서 사용자 입력을 받거나, 파싱할 URL을 전달하거나, S3 버킷에 업로드할 파일을 지정하는 것처럼 복잡한 상호작용 없이 프로그램이 명령줄 매개변수를 받도록 만들고 싶다면, argparse를 최소한의 노력으로 활용할 수 있습니다.

기본 사용법

  • 코드가 받아들일 인수를 정의합니다.

  • 인수 파서(argument parser)를 호출하여 결과 객체를 반환받습니다.

  • 파싱된 인수를 사용합니다.

요약하자면, 인수 파서의 전체적인 구조는 대략 다음과 같습니다.

def main( parameters):
<< Logic here >>

if __name__ == '__main__':
<< 1. Define argument parser >>
<< 2. Parse the arguements >>
<< 3. Validation >>
<< 4. call main (parameters) >>

__name__ == '__main__' 블록은 스크립트가 직접 실행될 때만 동작하며, 프로그램의 진입점(entry point) 역할을 합니다.

예제 1: 단일 인수 받기

테니스 선수 이름을 문자열 형태로 딱 하나만 받는 프로그램을 만들어 보겠습니다.

import argparse

def get_args():
""" Function : get_args
parameters used in .add_argument
1. metavar - Provide a hint to the user about the data type.
- By default, all arguments are strings.

2. type - The actual Python data type
- (note the lack of quotes around str)

3. help - A brief description of the parameter for the usage

"""

parser = argparse.ArgumentParser(
description='Example for Two positional arguments',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)

# Adding our first argument player name of type string
parser.add_argument('player',
metavar='player',
type=str,
help='Tennis Player')

return parser.parse_args()

# define main
def main(player):
print(f" *** The {player} had won 20 grandslam titles.")

if __name__ == '__main__':
args = get_args()
main(args.player)

a) 이제 명령줄에서 아무 매개변수 없이 프로그램을 실행하면, 프로그램을 올바르게 실행하는 방법에 대한 간단한 사용법(usage) 안내문이 출력됩니다.

In [3]: run <>.ipynb
usage: ipython [-h] player
ipython: error: the following arguments are required: player
An exception has occurred, use %tb to see the full traceback.

b) 반대로 인수를 두 개 이상 제공하면 프로그램은 정의되지 않은 두 번째 인수를 받았다는 오류를 발생시킵니다.

c) 즉, 프로그램이 정상적으로 실행되는 경우는 정확히 인수를 하나만 제공했을 때뿐입니다.

예제 2: 두 개의 인수 받기

이번에는 테니스 선수 이름(문자열)과 해당 선수가 획득한 그랜드슬램 우승 횟수(정수)라는 두 개의 인수만 받는 프로그램을 만들어 보겠습니다.

import argparse

def get_args():
""" Function : get_args
parameters used in .add_argument
1. metavar - Provide a hint to the user about the data type.
- By default, all arguments are strings.

2. type - The actual Python data type
- (note the lack of quotes around str)

3. help - A brief description of the parameter for the usage

"""

parser = argparse.ArgumentParser(
description='Example for Two positional arguments',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)

# Adding our first argument player name of type string
parser.add_argument('player',
metavar='player',
type=str,
help='Tennis Player')

# Adding our second argument player titles of type integer/number.
parser.add_argument('titles',
metavar='titles',
type=int,
help='Tennis Player Grandslam Titles')

return parser.parse_args()

# define main
def main(player, titles):
print(f" *** The {player} had won {titles} grandslam titles.")

if __name__ == '__main__':
args = get_args()
main(args.player, args.titles)

터미널을 열고 프로그램을 직접 실행해 보세요. 인수가 전달되지 않으면 스크립트는 원인을 알 수 있는 명확한 오류 메시지와 함께 에러를 반환합니다.

실행 결과

<<< python test.py
usage: test.py [-h] player titles
test.py: error: the following arguments are required: player, titles

<<< python test.py federer 20
*** The federer had won 20 grandslam titles.

이처럼 argparse를 사용하면 인수 개수나 데이터 타입 검증을 자동으로 처리해 주기 때문에, 잘못된 입력에 대한 방어 로직을 일일이 작성하지 않아도 됩니다. 선택적 인수(--optional)나 기본값 설정 등 더 다양한 기능도 공식 문서를 통해 확장해 볼 수 있습니다.