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 |