development

Python argparse-여러 하위 구문 분석기에 인수 추가

big-blog 2020. 12. 12. 12:08
반응형

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

반응형