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
'sourcetip' 카테고리의 다른 글
사용자가 Wordpress에서 게시물을 정렬할 수 있습니다. (0) | 2023.06.22 |
---|---|
C 또는 C++에서 At 기호(@)와 달러 기호($)는 특별한 의미가 있습니까? (0) | 2023.06.22 |
-I dir vs. -I system dir (0) | 2023.06.17 |
실행 실패:mariadb 및 perl DBD가 있는 '\xD6sterl...' 문자열 값이 잘못되었습니다. (0) | 2023.06.17 |
Python 스크립트 실행 시 "ImportError: No module named" (0) | 2023.06.17 |