Python argparse-여러 하위 구문 분석기에 인수 추가
내 스크립트는 하나의 주 파서와 여러 하위 파서를 정의합니다. -p
일부 하위 파서에 인수 를 적용하고 싶습니다. 지금까지 코드는 다음과 같습니다.
parser = argparse.ArgumentParser(prog="myProg")
subparsers = parser.add_subparsers(title="actions")
parser.add_argument("-v", "--verbose",
action="store_true",
dest="VERBOSE",
help="run in verbose mode")
parser_create = subparsers.add_parser ("create",
help = "create the orbix environment")
parser_create.add_argument ("-p",
type = int,
required = True,
help = "set db parameter")
# Update
parser_update = subparsers.add_parser ("update",
help = "update the orbix environment")
parser_update.add_argument ("-p",
type = int,
required = True,
help = "set db parameter")
보시 add_arument ("-p")
다시피이 두 번 반복됩니다. 실제로 더 많은 하위 구문 분석기가 있습니다. 반복을 피하기 위해 기존 하위 구문 분석기를 반복하는 방법이 있습니까?
기록을 위해 Python 2.7을 사용하고 있습니다.
이는 공통 옵션을 포함 하는 상위 파서 를 정의하여 수행 할 수 있습니다 .
import argparse
parent_parser = argparse.ArgumentParser(description="The parent parser")
parent_parser.add_argument("-p", type=int, required=True,
help="set db parameter")
subparsers = parent_parser.add_subparsers(title="actions")
parser_create = subparsers.add_parser("create", parents=[parent_parser],
add_help=False,
description="The create parser",
help="create the orbix environment")
parser_create.add_argument("--name", help="name of the environment")
parser_update = subparsers.add_parser("update", parents=[parent_parser],
add_help=False,
description="The update parser",
help="update the orbix environment")
그러면 다음 형식의 도움말 메시지가 생성됩니다.
parent_parser.print_help()
산출:
usage: main.py [-h] -p P {create,update} ...
The parent parser
optional arguments:
-h, --help show this help message and exit
-p P set db parameter
actions:
{create,update}
create create the orbix environment
update update the orbix environment
parser_create.print_help()
산출:
usage: main.py create [-h] -p P [--name NAME] {create,update} ...
The create parser
optional arguments:
-h, --help show this help message and exit
-p P set db parameter
--name NAME name of the environment
actions:
{create,update}
create create the orbix environment
update update the orbix environment
그러나 프로그램을 실행하는 경우 작업 (예 : create
또는 update
)을 지정하지 않으면 오류가 발생하지 않습니다 . 이 동작을 원하면 다음과 같이 코드를 수정하십시오.
<...>
subparsers = parent_parser.add_subparsers(title="actions")
subparsers.required = True
subparsers.dest = 'command'
<...>
이 수정은 풀 요청을 추적하는 문제를 나타내는 이 SO 질문 에서 제기되었습니다 .
하위 구문 분석기를 반복하고 모든 하위 구문 분석기에 동일한 옵션을 추가 할 수도 있습니다.
parser = argparse.ArgumentParser(prog="myProg")
subparsers = parser.add_subparsers(title="actions")
parser.add_argument("-v", "--verbose",
action="store_true",
dest="VERBOSE",
help="run in verbose mode")
parser_create = subparsers.add_parser ("create",
help = "create the orbix environment")
parser_update = subparsers.add_parser ("update",
help = "update the orbix environment")
for subparser in [parser_create, parser_update]:
subparser.add_argument ("-p",
type = int,
required = True,
help = "set db parameter")
다음과 같은 방법으로 하위 구문 분석기를 반복 할 수 있습니다.
for name, subp in subparsers.choices.items():
print(subp)
subp.add_argument(dest='g', help='Input for g variable', default=7, type=int)
이를 사용 subparsers.choices
하면 모든 하위 구문 분석기를 하드 코딩 할 필요가 없습니다.
허용 대답은 정확; 적절한 방법은 부모 파서 를 사용하는 것입니다 . 그러나 예제 코드 IMO는 실제로 문제를 해결하지 못했습니다. 더 적합한 예를 제공하기 위해 몇 센트를 추가하겠습니다.
The main difference with accepted answer is the explicit possibility to have some root-level arguments (like --verbose
) as well as shared arguments only for some subparsers (-p
only for the create
and update
subparsers but not for others)
# Same main parser as usual
parser = argparse.ArgumentParser()
# Usual arguments which are applicable for the whole script / top-level args
parser.add_argument('--verbose', help='Common top-level parameter',
action='store_true', required=False)
# Same subparsers as usual
subparsers = parser.add_subparsers(help='Desired action to perform', dest='action')
# Usual subparsers not using common options
parser_other = subparsers.add_parser("extra-action", help='Do something without db')
# Create parent subparser. Note `add_help=False` and creation via `argparse.`
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument('-p', help='add db parameter', required=True)
# Subparsers based on parent
parser_create = subparsers.add_parser("create", parents=[parent_parser],
help='Create something')
# Add some arguments exclusively for parser_create
parser_update = subparsers.add_parser("update", parents=[parent_parser],
help='Update something')
# Add some arguments exclusively for parser_update
This is the top-level help message (note that -p
parameter is not shown here, which is exactly what you would expect—because it is specific to some subparsers):
>>> parser.print_help()
usage: [-h] [--verbose] {extra-action,create,update} ...
positional arguments:
{extra-action,create,update}
Desired action to perform
extra-action Do something without db
create Create something
update Update something
optional arguments:
-h, --help show this help message and exit
--verbose Common top-level parameter
And the help message for the create
action:
>>> parser_create.print_help()
usage: create [-h] -p P
optional arguments:
-h, --help show this help message and exit
-p P add db parameter
참고URL : https://stackoverflow.com/questions/7498595/python-argparse-add-argument-to-multiple-subparsers
'development' 카테고리의 다른 글
Notepad ++로 파일 저장을위한 기본 인코딩 변경 (0) | 2020.12.12 |
---|---|
자바의 @Documented 주석 (0) | 2020.12.12 |
그레이 스케일 배경 CSS 이미지 (0) | 2020.12.12 |
Berksfile의 Chef 'cookbook'과 metadata.rb의 'depends' (0) | 2020.12.12 |
인터페이스 빌더-경로에서 디자인 가능 항목을로드하지 못했습니다 (null). (0) | 2020.12.12 |