Skip to content

Python:argparse

argparse 모듈을 사용하면 사용자 친화적인 명령줄 인터페이스를 쉽게 작성할 수 있습니다. 프로그램은 필요한 인수를 정의하고 argparse는 sys.argv에서 해당 인수를 구문 분석하는 방법을 알아냅니다. argparse 모듈은 도움말 및 사용법 메시지도 자동으로 생성합니다. 또한 사용자가 프로그램에 잘못된 인수를 제공하면 모듈에서 오류가 발생합니다.

위치 인수(Positional arguments)에 기본값 주기

Use nargs='?' (or nargs='*' if you need more than one dir)

parser.add_argument('dir', nargs='?', default=os.getcwd())

리스트 (Append) 인자

parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='append')
parser.parse_args('--foo 1 --foo 2'.split())  ## Namespace(foo=['1', '2'])

리스트 (Extend) 인자

리스트를 저장하고 각 인자 값으로 리스트를 확장합니다.

parser = argparse.ArgumentParser()
parser.add_argument("--foo", action="extend", nargs="+", type=str)
parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"])  ## Namespace(foo=['f1', 'f2', 'f3', 'f4'])

버전 출력

add_argument() 호출에서 version= 키워드 인자 필수. 호출되면 버전 정보를 출력하고 종료합니다:

import argparse
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--version', action='version', version='%(prog)s 2.0')
parser.parse_args(['--version'])  ## PROG 2.0

동시 존재 불가 플래그

parser = ArgumentParser(prog='PROG')
logging_group = parser.add_mutually_exclusive_group()
logging_group.add_argument("--colored-logging", action="store_true", default=False)
logging_group.add_argument("--simple-logging", action="store_true", default=False)

Help 출력시 Raw 포맷 사용

RawDescriptionHelpFormatter를 사용:

parser = ArgumentParser(
    prog='PROG',
    description='...',
    epilog='...',
    formatter_class=RawDescriptionHelpFormatter,
)

Example

def _get_args_by_argparse(
    cmdline: Optional[List[Any]] = None, namespace: Optional[Namespace] = None
) -> Namespace:
    parser = ArgumentParser(description="Node client of RECC")
    parser.add_argument(
        "--version",
        action="store_true",
        help="Print the version number and exit.",
    )
    parser.add_argument(
        "--timeout",
        type=float,
        metavar="seconds",
        help="Response timeout seconds. (default: INF)",
    )
    parser.add_argument(
        "--delay",
        type=float,
        default=DEFAULT_DELAY,
        metavar="seconds",
        help=f"Response delay seconds. (default: {DEFAULT_DELAY})",
    )
    parser.add_argument(
        "address",
        type=str,
        nargs="?",
        default=DEFAULT_NODE_ADDRESS,
        help=f"Node address (default: {DEFAULT_NODE_ADDRESS})",
    )
    return parser.parse_args(
        args=[str(x) for x in cmdline] if cmdline is not None else None,
        namespace=namespace,
    )

Troubleshooting

TypeError: can only concatenate str (not "int") to str

ArgumentParser 관련 코드에서 다음과 같은 에러가 난다면,

TypeError: can only concatenate str (not "int") to str

Namespace에 할당된 멤버들의 타입과 파서에 추가된 아규먼트의 액션에 주의하자.

from argparse import ArgumentParser, Namespace

namespace = Namespace()
namespace.verbose = "0"
parser = ArgumentParser(description="MINIDUN")
parser.add_argument(
    "--verbose",
    "-v",
    default=0,
    action="count",
    help="Be more verbose/talkative during the operation",
)
args = parser.parse_known_args(["-vv"], namespace)

아규먼트가 action="count"일 경우, #parse_args나 #parse_known_args에 넘겨주는 namespace인자가 존재할 경우 Count 가능한 타입, 즉 int 여야 한다.

WARNING

아규먼트가 Count Action 일 경우 namespace 인자로 넘겨준 값에 이어서 카운트 한다.

See also

Favorite site