Python 명령줄 인자 완벽 가이드 | sys.argv와 argparse 사용법

1. Python에서 명령줄 인수의 기본적인 사용법

명령줄 인수란?

Python 프로그램을 실행할 때 실행 명령과 함께 전달하는 추가 정보를 ‘명령줄 인수’라고 합니다. 이를 통해 프로그램의 동작을 유연하게 바꾸거나 외부에서 데이터를 쉽게 전달할 수 있습니다. 예를 들어, 파일명이나 설정 값을 인수로 전달하면 프로그램의 내용을 동적으로 변경할 수 있습니다.

sys.argv를 사용한 명령줄 인수 가져오기

Python에서는 표준 라이브러리인sys모듈을 사용하여 명령줄 인수를 가져올 수 있습니다。sys.argv는 명령줄 인수를 리스트 형태로 저장하고 있는 변수입니다. 리스트의 첫 번째 요소(sys.argv[0])는 실행되는 스크립트 이름이며, 두 번째 이후 요소가 인수로 전달된 값입니다。

샘플 코드: 간단한 계산 프로그램

import sys

def main():
    if len(sys.argv) < 3:
        print("오류: 인수가 2개 필요합니다")
        return

    num1 = float(sys.argv[1])
    num2 = float(sys.argv[2])
    print(f"합계: {num1 + num2}")

if __name__ == "__main__":
    main()
위의 프로그램은 명령줄에서 전달된 두 개의 숫자를 합산하여 출력합니다. 실행 예시는 다음과 같습니다。
$ python script.py 3 5
합계: 8.0

2. argparse 모듈에서의 고급 인자 처리

argparse의 기본

sys.argv에서는 기본적인 인자 획득이 가능하지만, 인자의 수が 많아지거나, 옵션 인자나 플래그(--verbose 등)를 사용할 경우에는 표준 라이브러리인 argparse 모듈이 유용합니다。이 모듈을 사용하면 인자 파싱과 에러 메시지의 자동 생성을 간단히 수행할 수 있습니다.

인자 파싱과 파서 생성

argparse를 사용하려면 먼저 인자를 파싱하기 위한 파서를 생성합니다. 다음으로 파서에 인자 설정을 하고, 실제로 커맨드라인 인자를 파싱합니다。

샘플 코드: 기본적인 argparse의 사용법

import argparse

def main():
    parser = argparse.ArgumentParser(description='샘플 프로그램입니다')
    parser.add_argument('arg1', help='첫 번째 인자')
    parser.add_argument('arg2', type=float, help='두 번째 숫자 인자')
    args = parser.parse_args()

    print(f"arg1 = {args.arg1}")
    print(f"arg2 = {args.arg2}")

if __name__ == "__main__":
    main()
이 프로그램에서는 두 개의 인자를 받습니다。arg1은 문자열로, arg2는 숫자로 처리되어 파싱 후 출력됩니다.
$ python script.py test 5.5
arg1 = test
arg2 = 5.5

옵션 인자와 플래그 처리

argparse의 강력한 기능으로, 옵션 인자와 플래그가 있습니다. 이를 통해 인자가 지정된 경우에만 동작하는 코드를 작성하거나, 상세한 출력(--verbose 플래그 등)을 제공할 수 있습니다。

샘플 코드: 옵션 인자와 플래그 사용

import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--verbose', action='store_true', help='상세 출력을 표시')
    parser.add_argument('numbers', nargs='+', type=float, help='숫자 목록')
    args = parser.parse_args()

    total = sum(args.numbers)
    if args.verbose:
        print(f"계산 상세: {args.numbers} 의 합계는 {total} 입니다")
    else:
        print(f"합계: {total}")

if __name__ == "__main__":
    main()
이 프로그램에서는 --verbose라는 플래그가 지정되면 상세한 출력이 이루어지고, 지정되지 않으면 간단한 결과가 표시됩니다.
$ python script.py 1 2 3 --verbose
계산 상세: [1.0, 2.0, 3.0] 의 합계는 6.0 입니다
侍エンジニア塾

3. 오류 처리와 인수 검증

인수의 개수와 타입 검증

명령줄 인수를 다룰 때에는, 사용자가 올바르게 인수를 제공하지 않은 경우 오류 메시지를 표시해 프로그램의 오동작을 방지하는 것이 중요합니다. 인수의 개수와 타입이 기대한 대로인지 검증함으로써 프로그램의 안정성을 유지할 수 있습니다。

샘플 코드: 인수의 개수와 타입 검증

import sys

def main():
    if len(sys.argv) != 3:
        print("오류: 두 개의 인수가 필요합니다")
        return

    try:
        num1 = float(sys.argv[1])
        num2 = float(sys.argv[2])
    except ValueError:
        print("오류: 인수는 숫자여야 합니다")
        return

    print(f"합계: {num1 + num2}")

if __name__ == "__main__":
    main()
이 프로그램에서는 인수의 개수가 3개(스크립트 이름 + 숫자 2개)가 아니면 오류 메시지를 표시하고, 숫자가 아닌 인수가 전달된 경우에도 오류 메시지를 표시합니다.

4. 실제 사용 사례와 응용

커맨드라인 도구 제작 예

커맨드라인 인자를 활용한 실용적인 예로, 파일 조작과 데이터 처리를 수행하는 커맨드라인 도구를 만들어 볼 수 있습니다。

샘플 코드: 파일의 줄 수를 세는 도구

import argparse

def main():
    parser = argparse.ArgumentParser(description='파일의 줄 수를 세는 도구')
    parser.add_argument('filename', help='세는 파일 이름')
    args = parser.parse_args()

    try:
        with open(args.filename, 'r') as file:
            lines = file.readlines()
            print(f"파일 {args.filename}의 줄 수: {len(lines)}")
    except FileNotFoundError:
        print(f"오류: 파일 {args.filename}을 찾을 수 없습니다")

if __name__ == "__main__":
    main()
이 도구는 지정한 파일의 줄 수를 세어 출력합니다。
$ python count_lines.py example.txt
파일 example.txt의 줄 수: 100
侍エンジニア塾

5. 정리

Python에서 명령줄 인자 처리 방법을 배우면 프로그램을 더 유연하게 만들 수 있습니다.sys.argv를 사용하는 간단한 방법부터 argparse를 이용한 복잡한 인자 처리까지, 실제 요구에 맞게 적절한 방법을 선택하는 것이 중요합니다.또한, 오류 처리와 인자 검증을 적용하면 더욱 견고한 프로그램을 만들 수 있습니다.