sourcetip

Argparse를 사용하여 선택한 하위 명령 가져오기

fileupload 2023. 6. 17. 09:38
반응형

Argparse를 사용하여 선택한 하위 명령 가져오기

python argparse와 함께 하위 명령을 사용하면 선택한 인수를 얻을 수 있습니다.

parser = argparse.ArgumentParser()
parser.add_argument('-g', '--global')
subparsers = parser.add_subparsers()   
foo_parser = subparsers.add_parser('foo')
foo_parser.add_argument('-c', '--count')
bar_parser = subparsers.add_parser('bar')
args = parser.parse_args(['-g', 'xyz', 'foo', '--count', '42'])
# args => Namespace(global='xyz', count='42')

그렇게args포함 안 함'foo'간단하게 쓰기sys.argv[1]가능한 글로벌 인수 때문에 작동하지 않습니다.하위 명령 자체를 가져오려면 어떻게 해야 합니까?

Argparse 하위 명령의 Python 문서 맨 아래에 이 작업을 수행하는 방법이 설명되어 있습니다.

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-g', '--global')
>>> subparsers = parser.add_subparsers(dest="subparser_name") # this line changed
>>> foo_parser = subparsers.add_parser('foo')
>>> foo_parser.add_argument('-c', '--count')
>>> bar_parser = subparsers.add_parser('bar')
>>> args = parser.parse_args(['-g', 'xyz', 'foo', '--count', '42'])
>>> args
Namespace(count='42', global='xyz', subparser_name='foo')

사용할 수도 있습니다.set_defaults()내가 찾은 예제 바로 위에 참조된 방법.

ArgumentParser.add_subparsers 가지고 있습니다.dest형식 인수는 다음과 같이 설명됩니다.

dest하위 명령 이름이 저장될 속성의 이름. 기본적으로None값이 저장되지 않습니다.

하위 파서를 사용한 간단한 작업 함수 레이아웃의 아래 예제에서 선택한 하위 파서는parser.parse_args().subparser.

import argparse


def task_a(alpha):
    print('task a', alpha)


def task_b(beta, gamma):
    print('task b', beta, gamma)


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers(dest='subparser')

    parser_a = subparsers.add_parser('task_a')
    parser_a.add_argument(
        '-a', '--alpha', dest='alpha', help='Alpha description')

    parser_b = subparsers.add_parser('task_b')
    parser_b.add_argument(
        '-b', '--beta', dest='beta', help='Beta description')
    parser_b.add_argument(
        '-g', '--gamma', dest='gamma', default=42, help='Gamma description')

    kwargs = vars(parser.parse_args())
    globals()[kwargs.pop('subparser')](**kwargs)

이 답변은 제 최근 작업에서 매우 유용하게 사용되었기 때문에 게시하고 싶었습니다.이 방법은 장식기를 사용하며(기존의 @ 구문에서는 사용되지 않음) 권장되는 경우 특히 유용합니다.set_defaults하위 구문 분석기에서 이미 사용되고 있습니다.

import argparse
from functools import wraps
import sys

def foo(subparser):
    subparser.error('err')

def bar(subparser):
    subparser.error('err')

def map_subparser_to_func(func, subparser):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(subparser, *args, **kwargs)
    return wrapper

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()

foo_parser = subparsers.add_parser('foo')
foo_parser.set_defaults(func = map_subparser_to_func(foo, foo_parser))

bar_parser = subparsers.add_parser('bar')
bar_parser.set_defaults(func = map_subparser_to_func(bar, bar_parser))

args = parser.parse_args(sys.argv[1:])
args.func()

map_subparser_to_func함수를 수정하여 서브파서를 클래스 속성 또는 내부의 글로벌 변수로 설정할 수 있습니다.wrapper기능을 직접 전달하는 대신 기능을 사용할 수 있으며 기능을 위해 기존의 장식기로 재작업할 수도 있습니다. 단, 이 경우 다른 레이어를 추가해야 합니다.

이렇게 하면 개체에 대한 직접적인 참조가 있습니다.

언급URL : https://stackoverflow.com/questions/4575747/get-selected-subcommand-with-argparse

반응형