Python:argparse
argparse 모듈을 사용하면 사용자 친화적인 명령줄 인터페이스를 쉽게 작성할 수 있습니다. 프로그램은 필요한 인수를 정의하고 argparse는 sys.argv에서 해당 인수를 구문 분석하는 방법을 알아냅니다. argparse 모듈은 도움말 및 사용법 메시지도 자동으로 생성합니다. 또한 사용자가 프로그램에 잘못된 인수를 제공하면 모듈에서 오류가 발생합니다.
위치 인수(Positional arguments)에 기본값 주기
Use nargs='?'
(or nargs='*'
if you need more than one dir)
리스트 (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 관련 코드에서 다음과 같은 에러가 난다면,
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 일 경우 |