Python의 argparse 모듈 마스터하기: 더 나은 CLI 구축하기

파이썬은 다양한 응용 프로그램을 만들 수 있는 강력한 프로그래밍 언어로, 기본 스크립트부터 대규모 소프트웨어 시스템까지 만들 수 있습니다. 가장 일반적인 프로그래밍 작업 중 하나는 명령줄 인터페이스(CLI)를 만드는 것인데, 이를 통해 사용자가 터미널이나 명령줄을 통해 프로그램과 상호 작용할 수 있습니다. CLI는 스크립팅, 자동화 및 그래픽 사용자 인터페이스가 비실용적인 경우에 필수적입니다.

명령줄 매개변수를 처리하는 것은 CLI를 설계하는 중요한 부분입니다. 이러한 인수는 사용자가 프로그램의 동작을 입력 매개변수로 제공하여 영향을 미칠 수 있게 합니다. 이러한 요소를 평가할 수 없다면 프로그램은 덜 유연하고 특정 작업에 대한 조정이 어려울 것입니다.

파이썬은 명령줄 인수 구문 분석을 위한 여러 모듈을 제공하지만, argparse 모듈은 간결함과 포괄성으로 눈에 띕니다. argparse 모듈은 기능적인 명령줄 인터페이스를 개발하기 쉽게 만들어줍니다. 매개변수 구문 분석을 자동으로 처리하고 유용한 지침을 표시하며 사용자가 잘못된 정보를 제공할 때 오류를 제공합니다.

이 튜토리얼에서는 파이썬argparse 패키지를 사용하는 방법을 살펴볼 것입니다. 먼저 파이썬의 명령줄 인터페이스와 명령줄 입력 구문 분석의 중요성을 개요로 살펴본 후 argparse 모듈과 그 이점에 대해 논의할 것입니다.

파이썬에서 명령줄 인터페이스 개요

명령 줄 인터페이스는 순수한 텍스트 기반 명령으로 실행되는 프로그램입니다. 사용자들은 일반적으로 프로그램 동작을 변경하는 인수와 옵션을 포함하는 명령을 터미널이나 명령 줄에 입력합니다. CLI는 쉽게 자동화되고 다른 기술과 통합되기 때문에 유용합니다.

Python에서 CLI는 명령 줄 입력을 수용하는 스크립트를 개발하여 만듭니다. 이 입력은 일반적으로 스크립트가 액세스하고 해석할 수 있는 인수 목록으로 제공됩니다. 기본 프로그램의 경우 sys.argv 목록을 통해 이러한 인수를 수동으로 처리하는 것이 충분할 수 있습니다. 그러나 프로그램의 복잡성이 증가하면 수동으로 인수를 처리하는 것은 비효율적이고 오류를 발생할 수 있습니다.

명령 줄 인수 구문 분석의 중요성

명령 줄 인수를 구문 분석하는 것은 여러 이유로 필요합니다: 

  • 유연성: 매개변수를 사용함으로써 프로그램은 코드를 변경하지 않고 여러 작업을 수행하거나 다른 데이터 집합에서 작동할 수 있습니다. 사용자는 처리할 파일, 설정 구성, 작동 모드를 지정할 수 있습니다.
  • 사용자 친화성: 적절한 인수 구문 분석을 통해 프로그램은 유용한 메시지를 표시하고 프로그램 사용 방법에 대해 사용자에게 안내하며 오류를 우아하게 처리할 수 있습니다.
  • 유지보수성: argparse와 같은 전용 파싱 모듈을 사용하면 코드가 더 명확해지고 유지보수가 쉬워집니다. 이를 통해 인수를 구문 분석하는 논리를 프로그램의 주요 작업에서 분리할 수 있습니다.

argparse 모듈 소개 및 이점

argparse 모듈은 Python 표준 라이브러리의 일부입니다. 따라서 추가 패키지를 설치하지 않고도 사용할 수 있습니다. 명령줄 입력을 구문 분석하는 간단하고 일관된 인터페이스를 제공합니다. argparse를 활용하는 몇 가지 장점은 다음과 같습니다:

  • 자동 도움말 생성: 코드의 인수를 기반으로 도움말 및 사용 메시지를 생성합니다.
  • 오류 처리: 사용자가 잘못된 인수를 입력했을 때 유용한 오류 메시지를 표시합니다.
  • 유형 변환: 매개변수 문자열을 자동으로 적절한 데이터 유형으로 변환할 수 있습니다.
  • 필수 위치 인수와 선택적 인수를 모두 지원하며 간단합니다.
  • 기본값: 사용자가 제공하지 않은 매개변수에 대한 기본값을 제공할 수 있습니다.

argparse는 개발자가 프로그램의 주요 기능에 집중할 수 있도록 독립적인 강력한 기반을 활용하여 명령줄 입력을 관리합니다.

argparse 설정 및 기본 사용

이제 명령줄 인수를 구문 분석하는 중요성과 argparse 사용의 장점을 다루었으니, Python 스크립트에서 argparse를 설정하고 사용하는 방법을 살펴보겠습니다.

argparse 설치 및 가져오기

argparse는 Python 표준 라이브러리의 일부이므로 별도로 설치할 필요가 없습니다. 스크립트의 시작 부분에서 바로 가져올 수 있습니다.

import argparse

이 줄은 argparse 모듈을 스크립트에 로드하여 명령줄 인수를 구문 분석하는 데 기능을 사용할 수 있도록 합니다.

간단한 인수 구문 분석기 생성

argparse를 활용하는 첫 번째 단계는 구문 분석기 개체를 생성하는 것입니다. 이 객체는 프로그램이 허용하는 인수에 대한 정보를 저장하고 명령줄 입력을 구문 분석합니다.

parser = argparse.ArgumentParser(description='Process some integers.')

이 예에서는 ArgumentParser() 객체를 생성하고 프로그램에 대해 설명합니다. 사용자가 도움말 옵션(-h 또는 --help)을 선택하면 이 설명이 표시됩니다.

위치 및 선택적 인수 추가

이제 구문 분석기를 개발했으므로 프로그램이 허용할 인수를 지정할 수 있습니다.

위치 인수 추가

위치 인수는 필수이며 정확한 순서로 제공되어야 합니다. 예를 들어 두 숫자를 더하는 스크립트를 고려해보겠습니다. 숫자에 대해 두 위치 인수를 정의할 수 있습니다:

parser.add_argument('num1', type=int, help='The first number to add.') parser.add_argument('num2', type=int, help='The second number to add.')

이 코드에서 num1num2는 위치 매개변수를 나타냅니다.

type=int는 매개변수를 정수로 변환해야 함을 나타냅니다. 도움 인수는 도움말 메시지에 나타날 설명을 지정합니다.

선택적 인수 추가

선택적 인수는 필수가 아니며 일반적으로 프로그램의 옵션을 추가하거나 동작을 변경합니다. 일반적으로 하나 또는 두 개의 대시로 접두사가 붙습니다. 우리는 자세한 출력을 활성화하는 선택적 인수를 추가할 것입니다:

parser.add_argument('-v', '--verbose', action='store_true', help='Increase output verbosity.')

여기에서:

  • 짧은 옵션은 -v입니다 (예: -v). --verbose는 긴 옵션입니다.
  • action='store_true'는 선택한 옵션이 True로 설정되도록 하며, 그렇지 않으면 False로 설정됨을 나타냅니다.
  • help 인수는 도움말 메시지에 설명을 지정합니다.

인수 구문 분석 및 값 액세스

모든 인수를 지정한 후에는 명령줄 입력을 구문 분석해야 합니다. 이를 달성하기 위해 .parse_args() 메소드를 사용합니다.

args = parser.parse_args()

구문 분석된 매개변수는 이제 args 변수에 속성으로 저장됩니다. 점 표기법을 사용하여 액세스할 수 있습니다.

result = args.num1 + args.num2 print('The sum of {} and {} is {}'.format(args.num1, args.num2, result)) if args.verbose: print('Verbose mode is enabled.')

모든 것을 함께 넣어서, 두 숫자를 더하고 선택적 자세한 모드를 포함하는 완전한 스크립트는 다음과 같습니다:

import argparse parser = argparse.ArgumentParser(description='Add two integers.') parser.add_argument('num1', type=int, help='The first number to add.') parser.add_argument('num2', type=int, help='The second number to add.') parser.add_argument('-v', '--verbose', action='store_true', help='Increase output verbosity.') args = parser.parse_args() result = args.num1 + args.num2 print('The sum of {} and {} is {}'.format(args.num1, args.num2, result)) if args.verbose: print('Calculation completed successfully.')

이 스크립트를 명령줄에서 실행하고 필수 위치 인수를 제공할 수 있습니다:

python add_numbers.py 3 5 The sum of 3 and 5 is 8

-v 또는 --verbose 옵션을 포함하면 스크립트는 추가적인 자세한 메시지를 출력합니다:

python add_numbers.py 3 5 --verbose The sum of 3 and 5 is 8 Calculation completed successfully.

사용자가 -h 또는 --help 옵션으로 스크립트를 실행하면 argparse는 자동으로 생성된 도움말 메시지를 표시합니다:

python add_numbers.py -h usage: add_numbers.py [-h] [-v] num1 num2 Add two integers. positional arguments: num1 The first number to add. num2 The second number to add. optional arguments: -h, --help show this help message and exit -v, --verbose Increase output verbosity.

이 기능은 프로그램 사용 방법에 대한 명확한 지침을 제공하여 사용자 친화성을 높입니다.

고급 인수 처리

Python에서 커맨드라인 프로그램을 개발할 때, 더 복잡한 인수 파싱이 필요한 상황을 마주칠 수 있습니다. Python의 argparse 모듈은 이러한 복잡한 요구 사항을 해결하기 위한 여러 기능을 포함하고 있어 유연하고 사용자 친화적인 인터페이스를 개발할 수 있게 해줍니다.

여러 인수를 위한 nargs 사용하기

응용 프로그램이 동일한 인수에 대해 여러 값을 수락해야 하는 상황이 있습니다. 예를 들어, 여러 파일을 동시에 처리하는 스크립트를 만들고자 한다고 가정해 보겠습니다. argparse의 nargs 매개변수를 사용하면 몇 개의 커맨드라인 인수를 읽어야 하는지를 지정할 수 있습니다.

여기서 여러 파일 이름을 수락하기 위해 nargs를 사용하는 방법은 다음과 같습니다:

import argparse parser = argparse.ArgumentParser(description='Process multiple files.') parser.add_argument('filenames', nargs='+', help='List of files to process.') args = parser.parse_args() for filename in args.filenames: print(f'Processing file: {filename}') # 파일 처리 코드를 여기에 추가하세요

이 경우 nargs='+'는 파서에게 파일 이름에서 하나 이상의 인수를 기대하도록 지시합니다. 사용자는 필요한 만큼 많은 파일 이름을 제공할 수 있으며, 이들은 args.filenames라는 리스트에 저장됩니다.

특정 개수의 인수를 수락하려면 nargs를 그 숫자로 설정하세요. 예를 들어, nargs=2는 정확히 두 개의 매개변수를 요구합니다.

인수 값을 제한하는 선택 사항 구현

때때로, 특정 유효 값 범위로 인수를 제한하고 싶을 때가 있습니다. 이는 사용자가 유효한 입력을 제공하도록 보장하여 실수나 예상치 못한 행동을 피할 수 있습니다. 옵션 매개변수를 사용하면 인수에 허용되는 값을 지정할 수 있습니다.

사용자가 선택한 모드에 따라 여러 활동을 실행하는 스크립트를 고려해 보십시오.

import argparse parser = argparse.ArgumentParser(description='Perform actions in different modes.') parser.add_argument('--mode', choices=['backup', 'restore', 'delete'], required=True, help='Mode of operation.') args = parser.parse_args() if args.mode == 'backup': print('Backing up data...') # 백업 코드 여기 elif args.mode == 'restore': print('Restoring data...') # 복원 코드 여기 elif args.mode == 'delete': print('Deleting data...') # 삭제 코드 여기

이 스크립트에서 --mode 인수는 옵션 중 하나여야 합니다. 사용자가 목록에 없는 값을 입력하면 argparse는 오류 메시지를 반환합니다.

부울 플래그 및 토글 처리

부울 플래그는 애플리케이션에서 특정 기능을 활성화 또는 비활성화하는 선택 사항입니다. 일반적으로 값 없이 정의되며, 단순히 명령에 플래그를 포함하여 사용합니다. 이러한 플래그는 argparse에서 action 매개변수를 사용하여 처리할 수 있습니다.

예를 들어, 스크립트에 디버그 모드를 포함해 보겠습니다:

import argparse parser = argparse.ArgumentParser(description='A script with debug mode.') parser.add_argument('--debug', action='store_true', help='Enable debug output.') args = parser.parse_args() if args.debug: print('Debug mode is enabled.') # 추가 디버그 정보 여기 else: print('Debug mode is disabled.')

action='store_true'를 사용하면 --debug 플래그가 존재할 때 args.debugTrue로 설정하고, 그렇지 않으면 False로 설정합니다.

기본값 설정 및 필수 인수

선택 인수에는 종종 합리적인 기본값이 포함됩니다. 이는 사용자가 해당 인수를 지정하지 않는 경우 응용 프로그램이 기본값을 사용한다는 것을 의미합니다. “default” 인수를 사용하여 기본값을 지정할 수 있습니다.

다음은 예시입니다:

import argparse parser = argparse.ArgumentParser(description='Adjust program settings.') parser.add_argument('--timeout', type=int, default=30, help='Timeout in seconds.') args = parser.parse_args() print(f'Timeout is set to {args.timeout} seconds.')

이 시나리오에서 사용자가 “–timeout”을 지정하지 않으면, 기본값은 30초입니다.

선택적 인수를 필수로 만들려면 “set required=True”를 사용합니다.

import argparse parser = argparse.ArgumentParser(description='Send a message.') parser.add_argument('--recipient', required=True, help='Recipient of the message.') args = parser.parse_args() print(f'Sending message to {args.recipient}.')

이제 스크립트는 “–recipient” 인수를 필요로 할 것입니다.

도움말 및 오류 메시지 사용자 정의

사용자에게 명확하고 유용한 메시지를 제공하는 것은 효과적인 명령줄 프로그램을 개발하는 중요한 구성 요소입니다. Python의 “argparse” 모듈은 자동으로 도움말 메시지를 생성하지만, 이러한 메시지를 수정하여 필요에 맞게 보다 잘 맞출 수 있습니다.

자동 도움말 메시지 생성

기본적으로 “argparse”는 도움말 메시지를 생성하며, “-h” 또는 “–help” 옵션을 사용하여 액세스할 수 있습니다. 이 메시지에는 프로그램의 사용 방법, 설명 및 각 인수에 대한 정보가 포함되어 있습니다.

예를 들어:

import argparse parser = argparse.ArgumentParser(description='Calculate factorial of a number.') parser.add_argument('number', type=int, help='The number to calculate the factorial for.') args = parser.parse_args()

사용자가 스크립트를 “-h”와 함께 실행하면:

usage: script.py [-h] number Calculate factorial of a number. positional arguments: number The number to calculate the factorial for. optional arguments: -h, --help show this help message and exit

이 자동 도움말 메시지는 추가적인 노력 없이 유용한 정보를 제공합니다.

도움말 설명 및 사용 메시지 사용자 정의

기본 도움말 메시지는 유용하지만, 추가 정보를 제공하거나 특정 구조에 맞게 변경하려면 설명, epilog 및 사용 텍스트를 “ArgumentParser”에서 변경할 수 있습니다.

예를 들어, 에필로그를 포함하고 사용 메시지를 개인화하려면:

import argparse parser = argparse.ArgumentParser( description='Convert temperatures between Celsius and Fahrenheit.', epilog='Enjoy using the temperature converter!', usage='%(prog)s [options] temperature') parser.add_argument('temperature', type=float, help='Temperature value to convert.') parser.add_argument('--to-fahrenheit', action='store_true', help='Convert Celsius to Fahrenheit.') parser.add_argument('--to-celsius', action='store_true', help='Convert Fahrenheit to Celsius.') args = parser.parse_args()

이제 사용자가 도움말 메시지를 확인하면 사용자 정의 설명, 사용법 및 에필로그가 포함됩니다:

python file.py --help usage: p.py [options] temperature Convert temperatures between Celsius and Fahrenheit. positional arguments: temperature Temperature value to convert. options: -h, --help show this help message and exit --to-fahrenheit Convert Celsius to Fahrenheit. --to-celsius Convert Fahrenheit to Celsius.

–to-fahrenheit 섭씨를 화씨로 변환합니다.

–to-celsius 화씨를 섭씨로 변환합니다.

오류 처리 및 사용자 피드백 관리

import argparse import sys class CustomArgumentParser(argparse.ArgumentParser): def error(self, message): print(f'Error: {message}') self.print_help() sys.exit(2) parser = CustomArgumentParser(description='Divide two numbers.') parser.add_argument('numerator', type=float, help='The numerator.') parser.add_argument('denominator', type=float, help='The denominator.') args = parser.parse_args() if args.denominator == 0: parser.error('Denominator cannot be zero.') result = args.numerator / args.denominator print(f'Result: {result}')

사용자가 잘못된 인수를 입력하면 argparse는 오류 메시지를 표시하고 프로그램을 종료합니다. 이 동작을 수정하여 더 유용한 피드백을 제공하거나 실패를 다르게 처리할 수 있습니다.

Python file.py 6 0 Error: Denominator cannot be zero. usage: file.py [-h] numerator denominator Divide two numbers. positional arguments: numerator The numerator. denominator The denominator. options: -h, --help show this help message and exit

한 가지 접근 방식은 ArgumentParser의 서브클래스에서 오류 메서드를 오버라이드하는 것입니다:

import argparse import os parser = argparse.ArgumentParser(description='Read a file and display its contents.') parser.add_argument('filepath', help='Path to the file.') args = parser.parse_args() if not os.path.exists(args.filepath): parser.error(f"The file {args.filepath} does not exist.") with open(args.filepath, 'r') as file: contents = file.read() print(contents)

사용자가 이 스크립트에서 0으로 나누기를 시도하면 애플리케이션은 오류 경고 및 도움말 텍스트를 표시하여 사용자에게 유효한 데이터를 제공하도록 안내합니다.

python app..py file usage: p.py [-h] filepath app.py: error: The file file does not exist.

스크립트에 사용자 정의 오류 처리를 포함할 수도 있습니다. 예를 들어, 잘못된 파일 경로를 처리하려면:

잘못된 경로로 스크립트를 실행하면 아래와 같은 오류가 표시됩니다:

실제 사례 및 사용 사례

실제 환경에서 argparse 모듈을 사용하는 방법을 이해하면 그 기능이 더욱 명확해집니다. 이제 argparse를 실제 애플리케이션에서 사용하는 몇 가지 예를 살펴보겠습니다.

명령줄 계산기 만들기

import argparse parser = argparse.ArgumentParser(description='Simple command-line calculator.') parser.add_argument('num1', type=float, help='First number.') parser.add_argument('operator', choices=['+', '-', '*', '/'], help='Operation to perform.') parser.add_argument('num2', type=float, help='Second number.') args = parser.parse_args() if args.operator == '+': result = args.num1 + args.num2 elif args.operator == '-': result = args.num1 - args.num2 elif args.operator == '*': result = args.num1 * args.num2 elif args.operator == '/': if args.num2 == 0: print('Error: Division by zero is not allowed.') exit(1) result = args.num1 / args.num2 print(f'The result is: {result}')

기본적인 산술 연산을 수행할 수 있는 간단한 계산기를 명령줄에서 개발해야 한다고 가정해 보겠습니다. 이 계산기는 두 개의 숫자와 요청된 계산을 수행할 연산자를 받아야 합니다.

python calculator.py 10 + 5 The result is: 15.0

이 작업에 접근하는 방법은 다음과 같습니다:

이 스크립트에서는 argparse 모듈을 사용하여 두 개의 숫자와 연산자를 포함한 세 개의 위치 인수를 정의합니다. choices 인수는 연산자를 유효한 산술 기호로 제한합니다. 사용자가 스크립트를 실행하면 다음과 같은 계산을 수행할 수 있습니다:

이 기본 계산기는 명령줄 옵션이 프로그램의 유연성과 상호작용성을 어떻게 향상시킬 수 있는지를 보여줍니다.

여러 옵션이 있는 파일 처리 스크립트 만들기

import argparse parser = argparse.ArgumentParser(description='Process text files.') parser.add_argument('input_file', help='Path to the input file.') parser.add_argument('-o', '--output', help='Path to the output file.') parser.add_argument('-m', '--mode', choices=['uppercase', 'lowercase'], default='uppercase', help='Processing mode.') parser.add_argument('-v', '--verbose', action='store_true', help='Enable verbose output.') args = parser.parse_args() 텍스트 파일을 처리하고 출력 파일 지정, 처리 모드 선택 및 자세한 출력 활성화와 같은 선택 사항을 제공하는 스크립트가 필요하다고 가정해 보겠습니다. with open(args.input_file, 'r') as file: content = file.read() if args.verbose: print(f'Reading from {args.input_file}') 다음은 이를 설정하는 방법의 예입니다: if args.mode == 'uppercase': processed_content = content.upper() else: processed_content = content.lower() if args.verbose: print('Processing content') # 입력 파일 읽기 if args.output: with open(args.output, 'w') as file: file.write(processed_content) if args.verbose: print(f'Writing output to {args.output}') else: print(processed_content)

# 내용 처리

python text_processor.py input.txt -o output.txt --mode lowercase -v Reading from input.txt Processing content Writing output to output.txt

# 출력 파일에 쓰거나 콘솔에 출력하기

이 스크립트는 입력 파일을 허용하고 출력 파일, 처리 모드 및 자세한 출력에 대한 옵션이 있습니다. 사용자는 코드를 수정하지 않고 스크립트 동작을 변경할 수 있습니다.

하위 명령어를 사용하여 CLI 도구를 개발하는

import argparse parser = argparse.ArgumentParser(description='Manage tasks.') subparsers = parser.add_subparsers(dest='command', required=True) 더 복잡한 응용 프로그램에서는 git commit 및 git push와 같은 명령을 사용하는 git과 유사하게 하위 명령이 필요할 수 있습니다. 이를 위해 argparse 모듈은 하위 파서를 제공합니다. parser_add = subparsers.add_parser('add', help='Add a new task.') parser_add.add_argument('name', help='Name of the task.') parser_add.add_argument('-p', '--priority', type=int, choices=range(1, 6), default=3, help='Priority of the task.') 하위 명령어가 포함된 CLI 도구를 만드는 방법은 다음과 같습니다: parser_list = subparsers.add_parser('list', help='List all tasks.') parser_list.add_argument('-a', '--all', action='store_true', help='List all tasks, including completed ones.') # 하위 명령어 'add' parser_complete = subparsers.add_parser('complete', help='Mark a task as completed.') parser_complete.add_argument('task_id', type=int, help='ID of the task to complete.') args = parser.parse_args() if args.command == 'add': print(f"Adding task '{args.name}' with priority {args.priority}") # 하위 명령어 'list' elif args.command == 'list': print('Listing tasks') if args.all: print('Including completed tasks') # 하위 명령어 'complete' elif args.command == 'complete': print(f'Marking task {args.task_id} as completed') # 작업 추가 코드

# 작업 목록 코드

# 작업 완료 코드

python task_manager.py add "Write report" -p 2 Adding task 'Write report' with priority 2

이 예에서 스크립트에는 add, listcomplete 세 개의 하위 명령어가 있습니다. 각 하위 명령어는 자체 인수를 가지고 있습니다. 사용자가 스크립트를 실행할 때 하위 명령어와 기타 매개변수를 입력합니다.

python task_manager.py list Listing tasks

예를 들면:

python task_manager.py complete 3 Marking task 3 as completed

작업 목록

작업 완료로 표시:

subparsers를 사용하면 복잡한 명령줄 도구를 만들어 조직화하고 확장하기 쉽게 할 수 있습니다. 이를 통해 단일 인터페이스에서 여러 가지 작업을 수행할 수 있는 응용 프로그램을 구축할 수 있습니다. 

Python argparse 최상의 실천 방법과 팁

명령줄 프로그램 개발은 단순히 작동하는 코드를 작성하는 것 이상을 포함합니다. 또한 깔끔하고 유지 관리가 용이하며 사용자 친화적인 코드를 작성하는 것도 포함됩니다.

다음은 argparse 모듈을 사용할 때의 몇 가지 모범 사례입니다.

가독성과 유지 관리를 위한 코드 조직

스크립트가 더 복잡해지면 이해와 유지 관리를 위해 코드를 조직하는 것이 중요합니다. 이를 달성하는 한 가지 방법은 함수와 클래스를 사용하여 코드의 별도 섹션을 조직하는 것입니다.

프로그램을 더 작고 재사용 가능한 조각으로 나누면 관리하기가 더 쉬워지고 코드 중복이 줄어듭니다.

예를 들어, 작업 관리 스크립트에서는 작업 추가, 작업 목록 및 작업 완료를 위한 서로 다른 함수를 정의할 수 있습니다. 이러한 구분은 한 번에 논리의 한 측면에 집중할 수 있게 하여 코드를 더 명확하게 만듭니다.

또 다른 효과적인 기술은 인수 구문 분석 로직을 코드의 나머지 부분과 분리하는 것입니다. 모든 인수 정의 및 구문 분석을 스크립트의 시작 부분이나 전용 함수에 배치하면 다른 사람들이 프로그램이 입력을 처리하는 방식을 이해하기가 더 쉬워집니다.

적절한 변수 이름을 사용하는 것도 가독성을 향상시킵니다. 변수 이름이 그 목적을 반영하도록 선택하여 코드를 보는 사람이 상황을 이해할 수 있도록 합니다. 함수가 수행하는 작업과 주요 세부 사항을 설명하는 주석 및 docstrings을 포함하면 이해를 높이는 데 도움이 될 수 있습니다.

명령줄 응용 프로그램 테스트 및 디버깅

응용 프로그램을 테스트하는 것은 올바르게 작동하는지 확인하고 초기 단계에서 결함을 발견하는 데 중요합니다. unittest 또는 pytest와 같은 Python 테스트 프레임워크를 사용하여 단위 테스트를 작성하는 것은 코드 테스트에 훌륭한 접근 방식입니다. 이러한 테스트를 통해 다양한 입력을 모방하고 함수가 제대로 작동하는지 확인할 수 있습니다.

예를 들어, 스크립트를 명령줄에서 실행하는 대신 명령줄 입력을 모킹하여 여러 시나리오를 테스트할 수 있습니다. 이 전략은 인수 파싱이 예상대로 작동하는지 확인하고 응용 프로그램이 다양한 시나리오를 올바르게 처리하는지 보장합니다.

예외를 우아하게 처리하는 것도 중요합니다. try-except 블록을 사용하면 오류를 포착하고 사용자에게 유용한 메시지를 전달할 수 있습니다. 이는 응용 프로그램을 보다 안정적이고 사용자 친화적으로 만듭니다.

스크립트에 디버그 플래그를 포함하는 것도 고려해 보세요. 이 플래그는 문제가 발생할 때 프로그램의 실행을 추적할 수 있는 추가 출력을 활성화할 수 있습니다. 이 옵션이 있으면 개발 및 유지 관리 중에 문제를 진단하기가 더 쉬워집니다.

argparse와 다른 인수 파싱 라이브러리 비교

비록 argparse가 Python 표준 라이브러리에서 유용한 유틸리티이지만, 명령줄 인수를 파싱하는 대체 방법을 제공하는 추가 라이브러리가 있습니다. 이러한 옵션을 이해하면 프로젝트에 적합한 도구를 선택하는 데 도움이 될 것입니다.

하나의 라이브러리는 Click입니다. Click은 데코레이터를 사용하여 커맨드라인 인터페이스를 생성하는 서드파티 패키지입니다. 더 직관적인 문법을 가지고 있으며 정교한 애플리케이션에 적합합니다. 예를 들어, Python 데코레이터를 사용하여 명령과 옵션을 생성하면 코드가 더 간결하고 이해하기 쉬워집니다.

Docopt는 프로그램의 도크스트링을 사용하여 커맨드라인 인터페이스를 정의할 수 있는 또 다른 옵션입니다. Docopt는 도움말 메시지를 자동으로 파싱하고 사용 지침이 도크스트링에 포함될 때 인수 파서를 구성합니다. 이 접근 방식은 우아하며 보다 사람 친화적인 명세가 필요한 간단한 스크립트에 적합합니다.

어떤 라이브러리를 사용할지 선택할 때는 프로젝트의 요구 사항을 고려하세요. 외부 종속성을 없애고 대부분의 상황을 처리할 수 있는 도구를 원한다면 argparse가 훌륭한 솔루션입니다. 더 직관적인 문법을 원하고 복잡한 애플리케이션에서 작업하고 있다면 Click이 더 적합할 수 있습니다. Docopt는 간단한 인터페이스를 가진 소규모 프로그램에 좋은 선택입니다.

결론

이 기사 전체를 통해 Python argparse 모듈을 사용하여 Python에서 명령줄 프로그램을 개발하는 방법을 살펴보았습니다. 실제 예제를 통해 사용자 입력을 받고 관련 작업을 수행하는 현실적인 스크립트를 만드는 방법을 배웠습니다.

Source:
https://www.datacamp.com/tutorial/python-argparse